我正在执行以下代码:
CallableStatement cs;
cs = conn.prepareCall("{ ? = call mypackage.myfunc()}");
cs.registerOutParameter(1, OracleTypes.CURSOR);
System.out.println(cs.execute());
System.out.println(cs.getResultSet());
ResultSet rs = (ResultSet) cs.getObject(1);
System.out.println(rs);
该函数声明如下:
CREATE OR REPLACE PACKAGE BODY myuser.mypackage AS
FUNCTION myfunc
return sys_refcursor
is
a_cursor sys_refcursor;
begin
open a_cursor for select * from mytable;
return a_cursor;
end myfunc;
end mypackage;
/
根据文档,如果有结果,则cs.execute()将返回true,cs.getResultSet()将具有值。但是,这是我得到的输出:
false
null
oracle.jdbc.driver.OracleResultSetImpl@b92a848
我正在使用Oracle Express 11.2.0和最新的驱动程序。
任何提示/解释/尝试的事情都将非常受欢迎。
谢谢!
答案 0 :(得分:2)
getResultSet()
通常与PreparedStatement
一起使用,它返回来自SQL SELECT
查询的数据,而不是对存储过程或函数的调用。所以我完全期待您看到的false
和null
值。
如果您有一个返回一个或多个ref游标的存储过程,则使用getObject
获取值并将它们转换为ResultSet
s。事实上,上面的代码就是这样,所以我不明白为什么你需要“尝试的东西”。
SQL SELECT
语句必须在某处发送所选数据,但由于您无法将绑定参数或类似内容放入SQL中作为数据的目标,因此需要单独的机制来获取通过JDBC访问此数据。这是getResultSet()
的用途。您的函数通过bind参数返回引用游标,因此不需要隐式“结果”,因为您可以通过bind参数访问数据。