2011-06-28 16 views
0

私はJava + iBatisを使用しており、カーソルを引数とするOracleストアド・プロシージャをコールする必要があります。 Googleは、カーソルをjavaの引数として受け入れるストアドプロシージャを呼び出す方法のコードサンプルを見つけるのを助けなかった。from javaストアド・プロシージャを呼び出して、oracleカーソルを引数として渡す方法

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

シナリオ:

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? 

答えて

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番目のプロシージャに渡します。これがうまくいくかどうかわかりません。そうでない場合は、おそらくそれを行う直接的な方法はありません。

+0

手順がさらにあります。基本的な理由は、ステップ1のSPは1つのDBに存在し、ステップ3のSPは別のDBに存在するということです。今はDBLink経由で処理していますが、DBリンクを避ける方法を探しています。だから私たちはボックス1でSPに電話をかけ、結果を得て、その結果をボックス2のSPに渡す必要があります。 – Omnipresent

+0

@Omnipresent:ああ、それは事柄を変えています:)オープン・カーソルを渡す方法は全くありませんinstance to another - カーソルは本質的にインスタンスメモリの構造体です。 –

+0

私は研究して何も見つからないので、これは悪い道だと私は信じています。ありがとう – Omnipresent

0

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

Oracleストアド・プロシージャに渡されるカーソルは、Oracleのみが提供できるAPIを持つオブジェクトを表します。 Javaプログラムはカーソルを十分に認識していないため、プロキシをコールしてコールをOracleに戻すオブジェクトを作成することはできません。

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

+0

カーソルのデータを読み取ってそのデータをネストしたテーブルとして新しいストアドプロシージャに渡すと、渡されたデータの上にカーソルを使ってカーソル入力パラメータでストアドプロシージャを呼び出すことができます。しかし、これは、カーソルがJava側に行かなかった場合よりもはるかに効率が悪くなります。 – antlersoft

+0

興味深い...私はコーナーをカットするのではなく、基礎となるアーキテクチャを変更するように人々に説得しようとします。この解決策が意味するものです。 – Omnipresent

関連する問題