2009-05-12 19 views
1

カンマで区切られた文字列を使用して、一連のレコード識別子をOracleプロシージャに渡したいとします。これをテンポラリテーブルに配置して、それ以降の処理でそれに参加したいと思います。私はこれについてどうやって行くのですか?OracleでCSV(カンマ区切りの値)を解析します。

CSVよりも優れたアプローチは、あまりにもよく聞こえるでしょう。データアクセスにODP.Netを使用しています。

答えて

2

私はODP.netについて何も知らないが、なぜすべてのレコード識別子をCSV文字列に連結するのか?

あなたのプロシージャに配列パラメータを作成し、配列の配列を渡す方が良いでしょう。識別子のリストをどこから得るか、また配列やCSV文字列として始めるかどうかによって決まりますか?ここで

は、配列型を使用して(あなたがINリストと似た何かができるが、その困難にバインドするために)一時テーブルを使用せずに、あなたのクエリにあることを参加の例です。

create or replace type my_test_type as object (id integer); 

create or replace type my_test_type_a as table of my_test_type; 

create or replace procedure my_test_proc(i_ids in my_test_type_a) 
is 
begin 

for row in (
    select a.l from 
    (
    select level l from dual connect by level <= 10 
    ) a, table(i_ids) b 
    where a.l = b.id 
) loop 
    dbms_output.put_line(row.l); 
end loop; 
end; 
/

に留意されたいです。テストプロシージャのクエリは、渡された配列を実際に他の実テーブルを結合できるクエリのテーブルに変換するために 'table'関数を使用しました。

また、サブクエリ 'a'では、トリックを使用して1から10までの値を持つ10個の行を含む偽のテストテーブルを作成します(これは、これが動作することを証明するためのテストデータです)。次のブロックを使用して

、我々はコードをテストすることができます動作します:

declare 
    v_id my_test_type; 
    v_ids my_test_type_a; 
begin 
    v_id := my_test_type(1); 
    v_ids := my_test_type_a(); 
    for i in 1.. 5 loop 
    v_id := my_test_type(i); 
    v_ids.extend; 
    v_ids(i) := v_id; 
    end loop; 
    my_test_proc(v_ids); 
end; 
/

限りDBMS_OUTPUTがオンになっているとして、これは1印刷する必要があります - テストデータテーブルは、あなたの配列に結合されているとして、5を!

0

INを使用するのはどうですか? select ... where id IN (...list-of-ids-here...)のように?

それ以外の場合は、プロシージャを呼び出す前に手動で値を挿入するか、挿入を行う特別なプロシージャを作成して、元のプロシージャを2番目の手順で呼び出すことをお勧めします。この方法では、すべてを単一のメソッドにまとめるよりもはるかに柔軟です。

関連する問題