gpt4 book ai didi

java - 使用 JDBC 从 PL/SQL 存储函数获取表返回值

转载 作者:行者123 更新时间:2023-11-30 05:49:32 26 4
gpt4 key购买 nike

我有一个 PL/SQL 存储函数,它返回一个整数表:

CREATE TYPE INT_TABLE IS TABLE OF INTEGER;

CREATE FUNCTION f (someParam IN INTEGER) RETURN INT_TABLE IS ...

我希望使用 JDBC 检索此函数的结果,以便我可以以某种方式遍历整数,无论​​是 ResultSetint[]、或其他。

函数 f 对数据库进行修改,因此不能在诸如 SELECT f(42) FROM DUAL; 的查询中调用。返回值的存在是为了通知调用者它修改的行的主键。我大概必须使用 CallableStatement,但无法弄清楚具体方法。从 here 中汲取灵感,我试过:

CallableStatement cs = conn.prepareCall("{? = call f(42)}");
cs.registerOutParameter(1, Types.ARRAY);
cs.execute();
ResultSet rs = cs.getArray(1).getResultSet();

但是,这会导致 registerOutParameter 行出现 java.sql.SQLException: Invalid argument(s) in call。我无法确定此错误的实际含义,因为文档对可能抛出的异常非常笼统。

我已经花了几个小时在谷歌上搜索,但对于如何进行却一头雾水。是否可以将表类型提取到 Java 中?如果没有,是否有其他方法可以从 PL/SQL 函数返回多个整数,这些整数可以提取到 Java 中?

最佳答案

弄清楚后我正在回答我自己的问题。

我非常接近解决方案;我只是错过了在 registerOutParameter 调用中指定类型名称。因此,最终解决方案如下所示:

cs = conn.prepareCall("{? = call f(42)}");
cs.registerOutParameter(1, Types.ARRAY, "INT_TABLE");
cs.execute();
ResultSet rs = cs.getArray(1).getResultSet();

这是 native JDBC,不需要任何 Oracle 扩展。

另一件让我感到困惑的事情是这个 ResultSet 的结构。它包含两列;第一个是索引,第二个是值 ( documentation link )。因此,如果要提取数组的元素,则需要为每一行调用 rs.getInt(2) 而不是 rs.getInt(1)

如果想要结果作为普通数组而不是 ResultSet,则对应的类型是 java.math.BigDecimal,所以它会是

...
cs.execute();
BigDecimal[] array = (BigDecimal[])(cs.getArray(1).getArray());

关于java - 使用 JDBC 从 PL/SQL 存储函数获取表返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58964619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com