Java 访问Oracle系统参考游标

Java 访问Oracle系统参考游标,java,oracle,plsql,Java,Oracle,Plsql,我被困在这里了。我在Oracle中有一个愚蠢的小函数,并试图用Java访问它。返回值应为SYS\u 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中的调用: Stri

我被困在这里了。我在Oracle中有一个愚蠢的小函数,并试图用Java访问它。返回值应为SYS\u 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中的任何函数或过程如果函数将不返回集合作为ref游标

String stmt = "{call ? := dbschema.pkg_tbl_tools.get_tbl_as_cur()}";
这种样式在Oracle中工作得很好,即使返回值是ref游标

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

rs = ((OracleCallableStatement)callableStatement).getCursor(1);
可以换成

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

不知道为什么。但它现在起作用了。再次感谢:)

您是在哪一行收到错误消息的?是不是最后一行,在那里你调用了
getCursor
?在
getCursor
调用之后,什么都没有发生。只有
捕获(异常)
。显示的错误消息打印在那里。PL/SQL函数在Oracle中工作吗?在Java代码中,您是否尝试过
getObject(1)
并将返回的内容转换为
ResultSet
?这是您实际的
stmt
?它是无效的,但它是如此错误,我不确定你是否把它弄坏了。这个错误消息和我以前看到的都不一样;也许堆栈跟踪会有帮助。什么是无效的?我确信这是可行的。另一个返回值为VARCHAR2的函数工作得很好;我希望它看起来像
stmt=“{call?:=dbschema….()}”。这相当于您的
BEGIN
/
END`版本。我的Oracle DB和驱动程序不知道如何处理
callStmt:
,或者
?=call
而不是
call?:=。您是直接使用JDBC驱动程序,还是通过框架使用JDBC驱动程序?我将仅在12c Oracle上进行测试<代码>开始。。。;结束也可以工作
{call?:=…}
。我在其他网站上发现的另一个组合,很可能是buillsh;)我已经编辑了我的答案。