访问Oracle SYS_REFCURSOR

时间:2014-01-10 17:20:54

标签: java oracle plsql

我有点被困在这里。我在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中的Call:

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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题已解决。

感谢您的帮助。总结最后的“技巧”,我将在这里发布解决方案。

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

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);

不知道为什么。但它现在有效。再次感谢:)