gpt4 book ai didi

java - 访问 Oracle SYS_REFCURSOR

转载 作者:太空宇宙 更新时间:2023-11-04 15:13:54 31 4
gpt4 key购买 nike

我有点被困在这里了。我在 Oracle 中有一个愚蠢的小函数,并尝试用 Java 访问它。返回值应该是 SYS_REFCURSOR。但如果我尝试用 Java 调用它,就会出现错误。

这是 Oracle 函数:

FUNCTION GET_TBL_AS_CUR
RETURN SYS_REFCURSOR
IS
Tbl SYS_REFCURSOR;
BEGIN

OPEN Tbl FOR SELECT * FROM test_tbl;
RETURN Tbl;

END;

这是 Java 中的调用:

String stmt = "callStmt: {?= call dbschema.pkg_tbl_tools.get_tbl_as_cur()}";
callableStatement = conn.prepareCall(stmt);
callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
System.out.println("Executing... " + stmt + "\n");

callableStatement.execute();

rs = ((OracleCallableStatement)callableStatement).getCursor(1);

} catch (Exception e) {
System.out.println(e.getMessage());
}

错误信息是:

Unknown SQL-Type: sqlKind = UNINITIALIZED

我做错了什么?

最佳答案

问题已解决。

感谢您的帮助。为了总结最终的“技巧”,我将在此处发布解决方案。

这种调用方式适用于 Oracle 中的任何函数或过程如果该函数不会返回集合作为引用游标。

String stmt = "{call ? := dbschema.pkg_tbl_tools.get_tbl_as_cur()}";

这种风格在 Oracle 中工作得很好,即使返回值是引用游标

String stmt = "BEGIN ? := dbschema.pkg_tbl_tools.get_tbl_as_cur(); END;";

下面一行

rs = ((OracleCallableStatement)callableStatement).getCursor(1);

可以改为

rs = (ResultSet) callableStatement.getObject(1);

不知道为什么。但现在可以了。再次感谢:)

关于java - 访问 Oracle SYS_REFCURSOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21050491/

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