我有点被困在这里。我在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
我做错了什么?
答案 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);
不知道为什么。但它现在有效。再次感谢:)