0

Java + iBatisを使用しており、カーソルを引数として取るOracleストアドプロシージャを呼び出す必要があります。Googleは、Javaからの引数としてカーソルを受け入れるストアドプロシージャを呼び出す方法のコードサンプルを見つけるのにあまり役立ちませんでした。

これはどのように達成できますか?

ステップのシナリオ:

 1. Java calls a Stored Proc passing primitives (varchar, char, etc) as
    parameters 
 2. Java retrieves the cursor returned from Step 1 
 3. Java calls a Stored Proc passing cursor from Step 2 as an argument  //how? 
4

2 に答える 2

1

これらが本当に唯一のステップである場合、つまり2つの呼び出しの間にJavaで重要なことを何もしていない場合は、Javaに戻らないようにする方が理にかなっています。

最初のプロシージャが実際に関数である場合は、ネストされた単一の呼び出しを実行するだけで済みます。

BEGIN proc2(proc1(...)); END;

カーソルはOracle内で渡され、Javaで処理する必要はまったくありません。

最初のプロシージャがカーソルをOUTパラメータとして返すプロシージャである場合、そのラッパー関数を記述して同じことを行うことができます。

CREATE OR REPLACE FUNCTION func1(...)
  RETURN SYS_REFCURSOR
  AS
    foo SYS_REFCURSOR;
  BEGIN
    proc1(..., foo);
    RETURN foo;
  END func1;
/

その後、BEGIN proc2(func1(...)); END;動作するはずです。

ここで、2つの呼び出しの間に本当にJavaにアクセスする必要がある場合OracleTypes.CURSORは、最初のプロシージャから出力値を取得するときに使用してから、そのオブジェクトを2番目のプロシージャに渡すだけです。これがうまくいくかどうかはわかりません。そうでない場合は、おそらくそれを直接行う方法はありません。

于 2011-06-28T15:19:15.960 に答える
0

あなたはこれを行うことはできません。

Oracleストアドプロシージャに渡されるカーソルは、Oracleだけが提供できるAPIを持つオブジェクトを表します。Javaプログラムは、カーソルについて十分に認識していないため、カーソルをプロキシして呼び出しをOracleに転送するようなオブジェクトを作成できません。

入力カーソルを受け取るストアドプロシージャが別のストアドプロシージャからのみ呼び出されるように、アプリを再設計する必要があります。

于 2011-06-28T14:53:38.447 に答える