使用 CallableStatement 从 Oracle DB 的自定义对象类型的关联数组中检索数据

Retrieving data from associative array of custom object type from Oracle DB using CallableStatement

总结

我正在从 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);
--------------------------------

我尝试过的东西

我使用 google 浏览了不同的网站。也经历了Whosebug。上面的代码是我被困的地方。由于第三个参数是数组元素的数据类型,我输入了 OracleTypes.OTHER 但这会抛出一个 SQLException: invalid column type 1111.
我在官方文档中读到,对于自定义对象类型,我们可以将它们映射到 Java 个对象。我也不知道该怎么做。请参考https://docs.oracle.com/cd/B19306_01/java.102/b14355/datacc.htm#BHCGCBJC

中的User_defined类型

我要简要说明的问题

适合我的情况的任何示例代码、详细文档、指向在线示例的链接。我特别需要知道 arg[2] 的 out 参数注册,以及如何从 callableStatement 映射到自定义 Java 对象(也许使用 .getObject(int) 但我不知道不知道映射)。

定义:

callableStatement.registerOutParameter(2, OracleTypes.ARRAY,"trans_list");

调用过程:

callableStatement.executeUpdate();            

然后取出参数as

   java.sql.Array array = callableStatement.getArray(2);
   Object outputParamValue = array.getArray();

如果需要,键入 Caste outputParamValue。

this answer

你不能。

  1. 您需要在 SQL 范围内定义数据类型(使用 CREATE TYPE)而不是在 PL/SQL 范围内,在一个包中 as JDBC 只能使用 SQL 定义的数据类型。
  2. 第 1 点的结果是 JDBC 不支持关联数组,因为它们只是 PL/SQL 数据类型,您需要使用集合(不像 C#,它只支持关联数组数组,不支持集合)。因此,您需要从类型中删除 INDEX BY 子句。
  3. 您需要能够将数组中的类型映射到 Java 数据结构;一种方法是使用 SQLData 界面。 .
  4. 中有一个示例