oracle - 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
假设我无法更改数据库中的任何内容。我尝试了一些使用“开始结束”构造的技巧,但失败了。任何线索将不胜感激,谢谢!
解决方案
就我而言,使用开箱即用的 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 并没有舒适的方法来做到这一点。
推荐阅读
- php - 如果文本中使用了某个单词,您可以更改文本颜色吗?
- avfoundation - AVFoundation Recording Audio Feature,如何更改语言?
- java - java - 如何在Java Spring Boot Web应用程序中分配目录级用户访问权限
- android - 如何修复这个浮动按钮?
- javascript - JavaScript 中的 forEach 无法收集对象值
- html - 元素之间的间距,如选项卡功能
- celery - zerok/celery-prometheus-exporter 将 celery_workers 计数为 0
- batch-file - 使用延迟变量值作为子字符串中的长度值
- vue.js - 输入字段响应缓慢 Vuetify
- python - 如何访问不同视图函数中的对象