问题
I am executing the following code:
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);
The function is declared as follows:
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;
/
According to the documentation, if there is a result then cs.execute() will return true and cs.getResultSet() will have a value. However, this is the output I get:
false
null
oracle.jdbc.driver.OracleResultSetImpl@b92a848
I am using Oracle Express 11.2.0 and the latest driver.
Any hints/explanations/things to try will be very welcome.
Thanks!
回答1:
getResultSet()
is typically used with PreparedStatement
s that return data from a SQL SELECT
query, not with calls to stored procedures or functions. So I completely expect the false
and null
values you are seeing.
If you have a stored procedure that returns one or more ref cursors, then you fetch the values using getObject
and cast them to ResultSet
s. In fact, your code above does exactly this, so I don't understand why you need 'things to try'.
A SQL SELECT
statement has to send the selected data somewhere, but because you can't put a bind parameter or suchlike into the SQL to act as the destination for the data, you require a separate mechanism for getting access to this data via JDBC. This is what getResultSet()
is for. Your function returns a ref cursor via a bind parameter, so there isn't any need for an implicit 'result', as you can access the data via the bind parameter.
来源:https://stackoverflow.com/questions/14946959/callablestatement-getresultset-always-return-null-when-calling-an-oracle-funct