2011-01-04 11 views
2

ここに私を近づけたようなヒントがいくつかありますが、いくつかの固有の問題がありますが、私はこの質問が独自の投稿。Oracleを書く手順選択で使用するアイテムのリスト

ここに私が持っているものがあります。標準REF CURSORを返すOracleプロシージャがあり、このREF CURSORがアプリケーションに渡されます。 REF CURSORは検索IDのリストです。

このリストを取得して別のデータストアに持ち込み、selectステートメントで使用したいとします。 REF CURSORをループすることでこれを達成することは絶対に可能ですが、避けることを望んでいます。私はかなりむしろSELECT...WHERE lookup_id IN result_ref_cursorを書くことができるでしょうか?SELECT...WHERE EXISTS...

まずはこれが可能ですか?それが可能であれば、私はどこから探し始めなければならないのかについてのヒントはありますか?

私は比較的新しいですが、一般的にRDBMでかなり経験がありますので、私のリンクをちょっと見てみてください。私は勉強することができます。大いに感謝します

+0

IDタイプのテーブルであるオブジェクトタイプを作成し、サブクエリのFROM句でTABLE()関数を使用することができます – kurosch

+0

「別のデータストア」とは別の物理データベースを意味しますか? – APC

答えて

1

なぜkuroschが彼の答えを「答え」にしなかったのか分かりません。

したがって、参照カーソルの出力の1行を記述するSQL型と、それ以前のテーブルであるSQL型を定義します。次に、refカーソルによって返された行を返すパイプライン関数を作成します。この関数は、標準SQLで使用できます。私はAsk Tomから借りています。

create or replace type myLookupId as object (id int) 
/

create or replace type myLookupIdTable as table of myLookupId 
/

create or replace function f return myLookupIdTable PIPELINED is 
    l_data myLookupId; 
    l_id number; 
    p_cursor SYS_REFCURSOR; 
begin 
    p_cursor := function_returning_ref_cursor(); 
    loop 
    fetch p_cursor into l_id; 
    exit when p_cursor%notfound; 
    l_data := myLookupId(l_id); 
    pipe row (l_data); 
    end loop; 
return; 
end; 
/

そして今、サンプルクエリ...

SELECT * 
FROM SOME_TABLE 
WHERE lookup_id in (SELECT ID FROM table(f)); 

申し訳ありませんが、コードが正確に右ではない場合、私は、DBが今テストする必要はありません。

+0

私はAsk Tomでこれを見て、いくつか一緒に遊んだ。私はそれを働かせることができませんでしたが、私はそれが私自身の失敗であると非常に確信しています。私が持っていた1つの質問は、私はそれらの型定義を私のパッケージに入れることができますか?私はDBのレベルで型を定義しなければならないことをどこかに見出しました。 – Andrew

+0

そうです、あなたはパッケージ内の型ではなくSQL型を作る必要があります。 –

0

あなたがこれで行くことができるいくつかの方向がありますが、私はあなたが望む特定のソリューションで検索しました。あなたが行うことができることは、oracle metalinkを検索することです。これは、通常、あいまいな回答を見つけるのには本当に良いことです。 (あなたはサービス契約が必要ですけれども - ちょうど:(鉱山の期限が切れていることが分かった)

他の可能な解決策:

は、あなたが直接PLSQLで

を選択を行うことができるようにデータ・ストア間のリンクを作成します。

Javaで、クエリの文字列を作成するためのループを作成する関数を作成します。

それ以外の場合、REF CURSORは前後に移動する必要があります。 1つの接続でREF CURSORの結果を別の接続のクエリにパイプすることができますそれ。

関連する問題