如果我理解得很好,您有一些动态 SQL 想要修改以使用变量值作为过滤器。
假设您无法编辑查询,这是一种处理双引号的方法,同时将占位符替换为变量值;例如:
declare
vSQL varchar2(100);
vVar varchar2(10);
vNum number;
begin
vSQL := 'select count(*) from dual where ''a'' = <SOME_VAR>';
vVar := 'a';
--
vSQL := replace (vSQL, '<SOME_VAR>', '''' || vVar || '''');
execute immediate vSQL into vNum;
dbms_output.put_line('Result: ' || vNum);
end;
如果您可以编辑动态 SQL,更好的方法是在 SQL 部分处理双引号,而不是在变量替换部分处理;例如:
declare
vSQL varchar2(100);
vVar varchar2(10);
vNum number;
begin
vSQL := 'select count(*) from dual where ''a'' = ''<SOME_VAR>''';
vVar := 'a';
--
vSQL := replace (vSQL, '<SOME_VAR>', vVar);
execute immediate vSQL into vNum;
dbms_output.put_line('Result: ' || vNum);
end;
另一种方法(恕我直言最好的方法)可能是使用绑定变量;例如:
declare
vSQL varchar2(100);
vVar varchar2(10);
vNum number;
begin
vSQL := 'select count(*) from dual where ''a'' = :SOME_VAR';
vVar := 'a';
--
execute immediate vSQL into vNum using vVar;
dbms_output.put_line('Result: ' || vNum);
end;
这假设您的数据类型是字符串,即使您可能需要日期;如果您有日期值,请考虑前两种方法需要与字符串进行转换,而您可以轻松地将绑定变量与日期变量一起使用,而无需强制转换;例如:
declare
vSQL varchar2(100);
vVar date;
vNum number;
begin
vSQL := 'select count(*) from dual where trunc(sysdate) = :SOME_VAR';
vVar := trunc(sysdate);
--
execute immediate vSQL into vNum using vVar;
dbms_output.put_line('Result: ' || vNum);
end;