首页 > 解决方案 > Vert.x 和 Oracle 数据库 - 如何调用返回整数表的函数?

问题描述

我正在尝试调用返回整数表的存储函数。我尝试使用的查询是: { call ? := SOME_PACKAGE.get_some_ids(?, ?, ?, ?, ?, ?) }

调用如下所示的函数: FUNCTION get_some_ids(one IN INTEGER, two IN INTEGER, three IN INTEGER, four IN INTEGER, five IN INTEGER, six OUT INTEGER) RETURN int_tab;

我这样准备这个电话:

conn.callWithParams(QUERY_GET_CONTRACTS,
    new JsonArray()
        .addNull()
        .add(10).add(10).add(10).add(10).add(10),
    new JsonArray()
        .add(OracleTypes.ARRAY)
        .addNull().addNull().addNull().addNull().addNull()
        .add("INTEGER"),

当我调用返回 ref 游标的函数时,这种方法可以正常工作(当然我使用了 OracleTypes.CURSOR)。该代码导致以下异常: java.sql.SQLException: Fail to construct descriptor: empty Object name

假设我无法更改数据库中的任何内容。我尝试了一些使用“开始结束”构造的技巧,但失败了。任何线索将不胜感激,谢谢!

标签: oraclejdbcvert.x

解决方案


就我而言,使用开箱即用的 vertx API 是不可能的。为了实现我所需要的,我必须创建像 JDBCClientImpl 和 JDBCConnectionImpl 这样的新类。客户端的 getConnection() 方法生成了我的自定义 JDBCConnectionImpl,并且此连接向公众公开了 unwrap() 方法,因此我可以执行通常的 JDBC。最后我可以像这样使用它:

CallableStatement callable = ((OJDBCConnectionImpl)conn).unwrap().prepareCall("my call");
callable.registerOutParameter(1, OracleTypes.ARRAY, "INT_TAB");

它并不完美,但如果你别无选择,它就会起作用。我认为他们应该提供一种以我们手动方式注册参数的方法,但是通过依赖 JSON 的 API 并没有舒适的方法来做到这一点。


推荐阅读