在 运行 时间为日期变量添加引号 - 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;