【发布时间】:2014-07-15 05:07:14
【问题描述】:
我已经定义了一个变量
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 未定义相关的异常。
问题:
我收到语法异常,因为 myString 中的 abc 和 def 周围的引号没有转义。 "'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;
【问题讨论】:
-
用alternative quoting mechanism 引用
execute immediate字符串。有关详细信息,请参阅副本。 -
或者你可以把单引号加倍,如
define myStrings = "''abc'',''def''"。分享和享受。 -
感谢您的建议,但似乎
replace函数将 myStrings 视为参数。即使我引用了'&myStrings'或"&myStrings"的引用,仍然会抛出语法异常。您是否有机会运行该示例?
标签: stored-procedures plsql oracle10g execute-immediate