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

时间:2021-02-24 07:19:59

标签: java oracle spring-boot plsql ojdbc

总结

我正在从 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) 但我不知道映射)。

2 个答案:

答案 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)

this answer

你不能。

  1. 您需要在 SQL 范围内(使用 CREATE TYPE)而不是在 PL/SQL 范围内定义数据类型,因为 JDBC 只能使用 SQL 定义的数据类型。
  2. 第 1 点的结果是 JDBC 不支持关联数组,因为它们是仅 PL/SQL 的数据类型,并且您需要使用集合(与 C# 不同,C# 只支持关联数组而不支持集合)。因此,您需要从类型中删除 INDEX BY 子句。
  3. 您需要能够从数组中的类型映射到 Java 数据结构;一种方法是使用 SQLData 接口。示例在 this answer 中。
相关问题