2017-08-17 4 views
1

私はこれを他のやり方に公開していると言って始めますが、今はこれが私が思い付くことができたすべてです。SQLクエリでplsqlテーブルタイプを使用するにはどうすればよいですか?

私はpackage.procedure内で作業していますが、検索条件に一致するレコードのIDを格納する配列/リストとしてテーブルタイプを使用しています。リストをコンパイルしたら、レコードIDが自分のリストにあるテーブルから選択するカーソルを開きたいと思う。

データ構造:あなたがネストした表のコレクションを使用できるOracle 12Cを使用している場合

open cur for 
     select col_a, 
       col_b, 
       col_c 
     from t_table 
     where id_column in (select lt_results(level) 
          from dual 
          connect by level <= ln_count); 
+0

は、最も重要な部分を忘れていた。

はところで、このことに注意してください現在の設定ではORA-01403が指定されています。オープン・カーソル・ラインにデータが見つかりません。私はエラーがwhere句のリストアクセスによって引き起こされていると確信しています。 – wombatatat

+0

バルクコレクトを使用して配列を作成する方がよいでしょう。また、SQLで配列を使用する場合は、スキーマレベルで型を作成する必要があります。つまり、「型の作成または置換...」です。さらに良い点は、なぜアレイを使っているのですか?なぜあなたのcur_refカーソルで 'id_column in(どこからid_columnを選択するの? – Boneist

+0

スティッキングポイントは収集ではありません。リターンカーソルのwhere句でリストを使用しています。 – wombatatat

答えて

2

ln_count := 0; 
    for recs in (select id_column from t_child where other_column = ls_criteria) 
    loop 
     ln_count := ln_count + 1; 
     lt_results(ln_count); 
    end loop; 

は、カーソルを開くと、リストへのアクセス:リストを移植

TYPE i_array IS TABLE OF t_table.id_column%TYPE INDEX BY PLS_INTEGER; 
lt_results i_array; 
ln_count pls_integer; 

このようなパッケージ:

create or replace package test is 

    TYPE i_array IS TABLE OF t_child.id_column%TYPE; 

    procedure run; 

end; 

create or replace package body test is 

    procedure run is 
    lt_results i_array := i_array(); 
    cur sys_refcursor; 
    begin 
    for r in (select id_column from t_child where other_column = ls_criteria) loop 
     lt_results.extend; 
     lt_results(lt_results.count) := r.id_column ; 
    end loop; 

    open cur for 
     select col_a, 
      col_b, 
      col_c 
     from t_table 
     where id_column in (select column_value from table(lt_results)); 
    end run; 

end; 

は前12Cにi_arrayは、データベースにする必要がありますタイプ:

create type i_array is table of varchar2(10); -- For example 

あなた自身を作成するのではなく、handy pre-existing collectionSYS.KU$_VCNTなどを使用することができます。

for r in (select id_column from t_child where other_column = ls_criteria) loop 
     lt_results.extend; 
     lt_results(lt_results.count) := r.id_column ; 
    end loop; 

このことによって、より効率的に置き換えることができます:

select id_column 
     bulk collect into lt_results 
     from t_child where other_column = ls_criteria; 
関連する問題