我定义了一个变量
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
in的引号myString
没有被转义。该值"'abc','def'"
必须是“定义”而不是“声明”,以便稍后替换。
问题:
是否可以“定义”一个变量,使我既可以将其用作表类型值,也可以将其用作执行立即语句中的字符串?
重现:
创造
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;