我在PL-SQL过程脚本中使用这一行:
select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = 15.06.17
这导致:
opponent = [1, 1, 1, 1, 1, 1]
但SQL没有执行它,因为REF_D不在引号('')
中如何将日期变量括在引号中?
P.S。我尝试过QUOTENAME但是我收到错误说:
必须声明标识符引号
一如既往..非常感谢任何帮助..
答案 0 :(得分:1)
如果我理解得很清楚,您需要修改一些动态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;
答案 1 :(得分:0)
正确的方法是使用参数。
但是,如果你想通过替换字符串中的值来做到这一点,那么用单引号定义字符串。在SQL中,您可以通过将单引号加倍来实现此目的:
l_query := 'select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = ''<REF_D>''';
答案 2 :(得分:0)
我会使用to_date函数将你的(我认为字符串)ref_d参数转换为日期
declare
l_query varchar2(1024) := 'select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = <REF_D>';
ref_d varchar2(100) := '09.12.16';
begin
l_query := replace(l_query,'<REF_D>','to_date('''||ref_d||''',''dd.mm.yy'')');
dbms_output.put_line(l_query);
end;
输出:
select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = to_date('09.12.16','dd.mm.yy')