调用Oracle函数时,CallableStatement.getResultSet()始终返回null

时间:2013-02-18 23:07:29

标签: oracle jdbc callable-statement

我正在执行以下代码:

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和最新的驱动程序。

任何提示/解释/尝试的事情都将非常受欢迎。

谢谢!

1 个答案:

答案 0 :(得分:2)

getResultSet()通常与PreparedStatement一起使用,它返回来自SQL SELECT查询的数据,而不是对存储过程或函数的调用。所以我完全期待您看到的falsenull值。

如果您有一个返回一个或多个ref游标的存储过程,则使用getObject获取值并将它们转换为ResultSet s。事实上,上面的代码就是这样,所以我不明白为什么你需要“尝试的东西”。

SQL SELECT语句必须在某处发送所选数据,但由于您无法将绑定参数或类似内容放入SQL中作为数据的目标,因此需要单独的机制来获取通过JDBC访问此数据。这是getResultSet()的用途。您的函数通过bind参数返回引用游标,因此不需要隐式“结果”,因为您可以通过bind参数访问数据。