1

我正在执行以下代码:

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

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

谢谢!

4

1 回答 1

2

getResultSet()通常与PreparedStatement从 SQL 查询返回数据的 s一起使用SELECT,而不是与对存储过程或函数的调用一起使用。所以我完全期待你看到的false和价值观。null

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

SQLSELECT语句必须将选定的数据发送到某处,但是由于您不能将绑定参数或类似参数放入 SQL 中以充当数据的目的地,因此您需要一个单独的机制来通过 JDBC 访问该数据。这是getResultSet()为了什么。您的函数通过绑定参数返回引用游标,因此不需要隐式“结果”,因为您可以通过绑定参数访问数据。

于 2013-02-21T22:00:30.197 回答