在运行时在日期变量周围添加引号 - SQL / PL-SQL

时间:2017-04-04 12:10:47

标签: sql oracle plsql oracle-sqldeveloper

我在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但是我收到错误说:

  必须声明

标识符引号

一如既往..非常感谢任何帮助..

3 个答案:

答案 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')