如何解决使用 CallableStatement 从 Oracle DB 的自定义对象类型的关联数组中检索数据
总结
我正在从 Spring-boot 应用程序调用 Oracle 12c 数据库中的存储过程 (SP)。我正在使用 CallableStatement 来做到这一点。 SP 的 OUT 参数之一是具有自定义对象类型元素的关联数组。我无法以正确的方法检索数据。
代码
TYPE trans_list IS TABLE OF T_RPT_TXN_DTLS_OBJ INDEX BY PLS_INTEGER;
TYPE T_RPT_TXN_DTLS_OBJ AS OBJECT( id VARCHAR2(20),amount NUMBER(10,2),desc VARCHAR2(100))
Connection connection = jdbcTemplate.getDataSource().getConnection();
OracleCallableStatement callableStatement = connection.prepareCall("{call SAMPLE_PROC(?,?)}").unwrap(OracleCallableStatement.class);
callableStatement.setString(1,ID);
--Here I don't kNow what to do--
callableStatement.registerIndexTableOutParameter(2,500,OracleTypes.OTHER,0);
--------------------------------
我尝试过的事情
我使用谷歌浏览了不同的网站。也通过了stackoverflow。上面的代码是我被困的地方。由于第三个参数是数组元素的数据类型,我输入了 OracleTypes.OTHER
但这会抛出一个 sqlException: invalid column type 1111
。
我在官方文档中读到,对于自定义对象类型,我们可以将它们映射到 Java 对象。我也不知道该怎么做。请参考https://docs.oracle.com/cd/B19306_01/java.102/b14355/datacc.htm#BHCGCBJC
我要问的是什么
任何示例代码、详细文档、适合我的案例的在线示例链接。我特别需要知道 out 参数注册的 arg[2],以及如何从 callableStatement
映射到自定义 Java 对象(也许使用 .getobject(int)
但我不知道映射)。
解决方法
定义:
callableStatement.registerOutParameter(2,OracleTypes.ARRAY,"trans_list");
调用过程:
callableStatement.executeUpdate();
然后取出参数为
java.sql.Array array = callableStatement.getArray(2);
Object outputParamValue = array.getArray();
如果需要,输入 Caste outputParamValue。
,你不能。
- 您需要在 SQL 范围内(使用
CREATE TYPE
)而不是在 PL/SQL 范围内定义数据类型,因为 JDBC 只能使用 SQL 定义的数据类型。 - 第 1 点的结果是 JDBC 不支持关联数组,因为它们是仅 PL/SQL 的数据类型,并且您需要使用集合(与 C# 不同,C# 只支持关联数组而不支持集合)。因此,您需要从类型中删除
INDEX BY
子句。 - 您需要能够从数组中的类型映射到 Java 数据结构;一种方法是使用
SQLData
接口。示例在 this answer 中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。