変数を定義しました
define myStrings = "'abc','def'"
後でプロシージャブロック内で使用し、テーブルに変換する必要がありますvarchars
declare
type varcharListType is table of varchar(200);
myList varcharListType;
begin
myList := varcharListType(&myStrings);
.
.
.
end;
/
IN
プロシージャ ブロック内の作成クエリの句内で変数またはテーブルを使用しようとしています。
execute immediate 'create table tmp_foo '
|| 'as select * from bar '
|| 'where bar_val in (&myStrings) ';
the REPLACE
関数も使ってみました
myNewStrings := replace(&myStrings, '''' , '''''');
しかし、定義されていないことにabc
関連する例外が発生します。def
問題:
abc
前後の引用符がエスケープされていないdef
ため、構文例外が発生します。myString
値"'abc','def'"
は「宣言」するのではなく「定義」する必要があるため、後で置換されます。
質問:
変数をテーブル型の値としても、execute immediate ステートメントの文字列としても使用できるように、変数を「定義」することはできますか?
再現するには:
作成
create table bar (bar_id number not null, bar_val varchar2(20),
constraint bar_pk primary key (bar_id)
enable
);
入れる
insert into bar (bar_id, bar_val)
values (1, 'abc'),
(2, 'def'),
(3, 'ghi');
サンプル手順
set verify off;
set serveroutput on;
define myStrings = "'abc','def'"
declare
type varcharListType is table of varchar(20);
myList varcharListType;
begin
myList := varcharListType(&myStrings);
execute immediate 'create table tmp_foo '
|| 'as select * from bar '
|| 'where bar_val in (&myStrings) ';
for i in myList.FIRST..myList.LAST loop
dbms_output.put_line('VALUE: ' || myList(i));
end loop;
end;
/
set serveroutput off;
set verify on;