在 运行 时间为日期变量添加引号 - SQL / PL-SQL
Adding quotes around a date variable at run time - SQL / PL-SQL
我在我的 PL-SQL 过程脚本中使用了这一行:
l_query := REPLACE(l_query,'<REF_D>', REF_D)
这导致:
select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = 15.06.17
但是 SQL 没有执行它,因为 REF_D 不是引号 ('')
如何将日期变量括在引号中?
P.S。我试过 QUOTENAME 但我收到一条错误消息:
identifier quotename must be declared
一如既往..非常感谢任何帮助..
正确的做法是使用参数。
但是,如果您想通过替换字符串中的值来执行此操作,请使用单引号定义字符串。在 SQL 中,您可以通过将单引号加倍来实现:
l_query := 'select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = ''<REF_D>''';
我会使用 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')
如果我理解得很好,您有一些动态 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;
这假定您的数据类型是字符串,即使看起来您可能需要日期;如果您有日期值,请考虑前两种方法需要转换 to/from 字符串,而您可以轻松地将绑定变量与日期变量一起使用,而无需强制转换;例如:
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;
我在我的 PL-SQL 过程脚本中使用了这一行:
l_query := REPLACE(l_query,'<REF_D>', REF_D)
这导致:
select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = 15.06.17
但是 SQL 没有执行它,因为 REF_D 不是引号 ('')
如何将日期变量括在引号中?
P.S。我试过 QUOTENAME 但我收到一条错误消息:
identifier quotename must be declared
一如既往..非常感谢任何帮助..
正确的做法是使用参数。
但是,如果您想通过替换字符串中的值来执行此操作,请使用单引号定义字符串。在 SQL 中,您可以通过将单引号加倍来实现:
l_query := 'select sum(rec_count) from mt_table_status where table_id = 8942 and ref_d = ''<REF_D>''';
我会使用 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')
如果我理解得很好,您有一些动态 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;
这假定您的数据类型是字符串,即使看起来您可能需要日期;如果您有日期值,请考虑前两种方法需要转换 to/from 字符串,而您可以轻松地将绑定变量与日期变量一起使用,而无需强制转换;例如:
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;