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 クエリからデータを返す で使用されます。SELECTだから私はあなたが見ている値falseと値を完全に期待しています。null

1 つ以上の ref カーソルを返すストアド プロシージャがある場合は、 を使用して値をフェッチし、それらをsgetObjectにキャストします。ResultSet実際、上記のコードはまさにこれを行っているため、「試してみること」が必要な理由がわかりません。

SQLSELECTステートメントは、選択したデータをどこかに送信する必要がありますが、データの送信先として機能するバインド パラメーターなどを SQL に入れることはできないため、JDBC を介してこのデータにアクセスするための別のメカニズムが必要です。これがgetResultSet()目的です。関数はバインド パラメータを介して ref カーソルを返すため、バインド パラメータを介してデータにアクセスできるため、暗黙的な「結果」は必要ありません。

于 2013-02-21T22:00:30.197 に答える