カンマで区切られた文字列を使用して、一連のレコード識別子をOracleプロシージャに渡したいとします。これをテンポラリテーブルに配置して、それ以降の処理でそれに参加したいと思います。私はこれについてどうやって行くのですか?OracleでCSV(カンマ区切りの値)を解析します。
CSVよりも優れたアプローチは、あまりにもよく聞こえるでしょう。データアクセスにODP.Netを使用しています。
カンマで区切られた文字列を使用して、一連のレコード識別子をOracleプロシージャに渡したいとします。これをテンポラリテーブルに配置して、それ以降の処理でそれに参加したいと思います。私はこれについてどうやって行くのですか?OracleでCSV(カンマ区切りの値)を解析します。
CSVよりも優れたアプローチは、あまりにもよく聞こえるでしょう。データアクセスにODP.Netを使用しています。
私は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を!
INを使用するのはどうですか? select ... where id IN (...list-of-ids-here...)
のように?
それ以外の場合は、プロシージャを呼び出す前に手動で値を挿入するか、挿入を行う特別なプロシージャを作成して、元のプロシージャを2番目の手順で呼び出すことをお勧めします。この方法では、すべてを単一のメソッドにまとめるよりもはるかに柔軟です。
SQL Loaderは、このタスク
http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96652/ch03.htm#1656
に最適ですあなたは、日付のためにいくつかの形式を指定することができますし、CSVからのOracleにデータをインポートするための便利なオプションがたくさんあります。