Oracle PL/SQL内で自分の作成したデータ型の変数をどのように埋めることができますか?
-
04-10-2019 - |
質問
Oracleでデータ型を作成しました。
TABLE of VARCHAR2(200)
このタイプの変数をストアドプロシージャ(DBの実際のテーブルとしてではなく、ローカルで定義)内に変数を持ち、データを埋めたいです。
一部のオンラインサンプルは、型が記入され、ストアドプロシージャのパラメーターとして渡された場合に私のタイプをどのように使用するかを示しています。
SELECT column_value currVal FROM table(pMyPassedParameter)
しかし、私が望むのは、PL/SQLコード自体で、ステートメントを挿入することです。
誰かがこれの構文を知っていますか?
編集:私は明確にする必要があります:私のソースデータは、ストアドプロシージャに渡されるVARCHAR2パラメーターとして入力されます:セパレーター(コンマのような)区切り文字列。すべての個別の値を取得するために、区切り文字列を既に繰り返しています - それぞれを自分のタイプに挿入して、それを残りのロジックのテーブルとして扱うことができます。
解決
「PL/SQLコード自体で、挿入ステートメントでそれを記入することが欲しい」
これは、他のPL/SQL変数を入力するようなものです。使用する必要があります。複数の行を埋め込んでいるからのみ、バルク収集構文を使用する必要があります。
declare
l_array your_nested_table_type;
begin
select col1
bulk collect into l_array
from t72;
end;
/
結果セットが多くのレコードを返す場合、ループ内の制限句を使用することをお勧めします。これは、PL/SQLコレクションが、他のすべてのPL/SQL変数と同様に、セッションメモリに保持されているためです。したがって、配列が大きくなりすぎてはいけません。そうしないと、PGAを吹き飛ばす可能性があります。 詳細をご覧ください.
編集
「私は質問を編集して、具体的に何が欲しいかを明確にしました」
はぁ 文字列のトークン化は、まったく異なる問題です。私は以前、2つのスレッドにソリューションを投稿しました。 9i以前の使用を使用している場合 このアプローチ. 。それ以外の場合は使用します この正規表現ソリューション (実際、これは文字列を数値トークンに分割しますが、文字に変換するのは簡単です)。
編集2
「値を追加することで、「内部的に」(ストアドプロシージャ内)タイプを使用できるようにしたいだけです。これは最初のリンクでできることですか?」
もちろん。なぜだめですか?
SQL> declare
2 local_array tok_tbl;
3 begin
4 local_array := parser.my_parse('Keith Pellig,Peter Wakeman,Ted Bentley,Eleanor Stevens');
5 local_array.extend();
6 local_array(5) := 'Reese Verrick';
7 for i in local_array.first()..local_array.last()
8 loop
9 dbms_output.put_line(local_array(i));
10 end loop;
11 end;
12 /
Keith Pellig
Peter Wakeman
Ted Bentley
Eleanor Stevens
Reese Verrick
PL/SQL procedure successfully completed.
SQL>
ここで私は私のSQLタイプを再利用しましたが、それは同様に機能します TOK_TBL
代わりにPL/SQLパッケージで宣言されました。
他のヒント
作成したタイプがSQLタイプかPL/SQLタイプかは言及していません。それらはPL/SQLで同様に使用されているため、次のようなコマンドを持つSQLタイプを作成したと仮定します。
SQL> CREATE TYPE tab_varchar IS TABLE of VARCHAR2(200);
2 /
Type created
これはネストされたテーブルです。探し出す PL/SQLでコレクションを操作する方法 たとえば、ドキュメントでは:
SQL> DECLARE
2 lt tab_varchar;
3 BEGIN
4 /* initialization */
5 lt := tab_varchar('a', 'b', 'c');
6 /* adding elements */
7 lt.extend(1);
8 lt(4) := 'd';
9 FOR i IN lt.FIRST .. lt.LAST LOOP
10 dbms_output.put_line('lt(' || i || ')=' || lt(i));
11 END LOOP;
12 END;
13 /
lt(1)=a
lt(2)=b
lt(3)=c
lt(4)=d