我正在从 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)
但我不知道映射)。
答案 0 :(得分:0)
定义:
callableStatement.registerOutParameter(2, OracleTypes.ARRAY,"trans_list");
调用过程:
callableStatement.executeUpdate();
然后取出参数为
java.sql.Array array = callableStatement.getArray(2);
Object outputParamValue = array.getArray();
如果需要,输入 Caste outputParamValue。
答案 1 :(得分:0)
你不能。
CREATE TYPE
)而不是在 PL/SQL 范围内定义数据类型,因为 JDBC 只能使用 SQL 定义的数据类型。INDEX BY
子句。SQLData
接口。示例在 this answer 中。