3

Oracleにストアドプロシージャ(SP)があります。

CREATE OR REPLACE 
PROCEDURE "SP_SEL_LOGIN_INFO" (
p_username IN varchar2,
p_ResultSet OUT sys_refcursor
) AS

begin

OPEN p_ResultSet FOR
SELECT * FROM user_accounts
WHERE p_username = username;

end;

私のJavaクラスには、SPを呼び出すための次のコード行があります。

currentCon = connectionpackage.ConnectionManager.getConnection(dbSource);
CallableStatement stmt = currentCon.prepareCall("{call SP_SEL_LOGIN_INFO(?, ?)}");
stmt.setString(1, username); 
stmt.registerOutParameter(2, OracleTypes.CURSOR); //REF CURSOR
stmt.execute();
rs = stmt.getCursor(2);

それは私がSPを呼び出してカーソルを返すためにオンラインで見つけたものです。コンパイルしようとすると、次の2つのエラーが発生します。

error: cannot find symbol stmt.registerOutParameter(2, OracleTypes.CURSOR);ANDOracleTypeserror: cannot find symbol rs = stmt.getCursor(2);とgetCursorが見つからないと表示されている場合。

import oracle.jdbc.driver.*;またはをインポートしてみましたが、それぞれimport oracle.jdbc.*;エラーが発生しました。error: package oracle.jdbc does not exist import oracle.jdbc.driver.*;error: package oracle.jdbc does not exist import oracle.jdbc.*;

また、適切なフォルダーにojdbc14.jarファイルがあり、クエリ文字列を使用して接続できます。SPを使おうとすると困ります。

SPは現在のCFWebサイトで使用しているものなので、そのまま再利用したいと思います。誰かがこれがうまくいかない理由に光を当てていただけませんか?または、Oracle SPからカーソルを返すために使用する代替コードがある場合はどうなりますか?ありがとう。

4

3 に答える 3

4

これを試してください。問題が解決する可能性があります。

これを交換してください

rs = stmt.getCursor(2);

 rs = ((OracleCallableStatement)stmt).getCursor(2);

また、プロシージャの呼び出しには、以下のステートメントを使用します。

CallableStatement stmt = conn.prepareCall("BEGIN SP_SEL_LOGIN_INFO(?, ?); END;");
于 2012-06-27T07:36:59.557 に答える
1

次のようにすることもできます。

rs = (ResultSet) stmt.getObject(2);
while (rs.next()) {
     String field1 = rs.getString(1);
     System.out.println(field1);
}

それは私の側で適切に実行されています

于 2020-02-18T09:18:55.297 に答える
0

誰かがこれがうまくいかない理由に光を当てていただけませんか?または、Oracle SPからカーソルを返すために使用する代替コードがある場合はどうなりますか?

(レコード)のみを返したい場合は、ストアドプロシージャよりもresultsets返す関数を使用してみませんか?sys_refcursorもちろん、procedureまたはを使用してfunctionもパフォーマンスの点で違いはありません。これは、ステートメント以外のことをしていないfunctionため、ベストプラクティスになります。procedureselect

よろしく

于 2012-06-27T13:05:02.413 に答える