2

ここに近づいたように思われるヒントがいくつかありますが、いくつかの固有の問題があるため、この質問が独自の投稿に値するほど十分に区別されていることを願っています。

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

次に、このリストを取得して別のデータストアに移動し、selectステートメントで使用します。REF CURSORをループすることでこれを実現することは絶対に可能ですが、それを避けたいと思っています。SELECT...WHERE lookup_id IN result_ref_cursor私はむしろORを書くことができると思いますSELECT...WHERE EXISTS...

まず、これは可能ですか、それともエレガントではない解決策を試してみるべきですか?可能であれば、どこから探し始めるべきかについてのヒントはありますか?

私はOracleに比較的慣れていませんが、一般的にRDBMの経験が豊富なので、リンクをたどって自由に勉強してください。とても有難い

4

2 に答える 2

1

なぜクロッシュが彼の答えを「答え」として出さなかったのか私にはわかりません。

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

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がありません。

于 2011-01-05T04:07:36.360 に答える
0

これで進むことができるいくつかの方向性がありますが、私はあなたが望む特定の解決策を検索しました、そして誰もそこに現れるのに十分な頻度でそれをしなかったようです。あなたができることは、オラクルメタリンクを検索することです-それは通常、あいまいな答えを見つけるのに本当に優れています。(サービス契約は必要ですが、私の有効期限が切れていることがわかりました:()

その他の可能な解決策:

plsqlで直接選択できるように、データストア間にリンクを作成します

クエリの文字列を作成するために、Javaでループする関数を作成します。これは少なくとももう少しきれいに見えます。

それ以外の場合は、REFCURSORを前後に移動する必要があります。ある接続のREFCURSORの結果を、ループせずに別のクエリにパイプする方法がわかりません。

于 2011-01-04T21:29:45.553 に答える