执行立即变量中的单引号-Oracle PLSQL

时间:2019-06-04 08:40:52

标签: oracle plsql

我有一个存储过程,它具有:

execute immediate 'SELECT COUNT(S_NM) FROM '||lc_s_d_tb_nm||' WHERE S_NM IN('''||in_s_nm||''') AND '||lc_s_t_col||'='''||in_s_type||''' ' into lc_s_count;

参数in_s_nm由另一个函数发送,其中一个值为-Test - Mother's Identifier

由于'(撇号),我的SQL无法正常工作。

我如何解决它才能起作用?

3 个答案:

答案 0 :(得分:2)

您应该就此停止。.我重复一次,不要使用不要在动态SQL中使用值的串联(表和列名或出于教育目的除外:- ;)。它容易受到SQL Injection的攻击,可能会成为安全威胁。

您的查询应重写为

EXECUTE IMMEDIATE 'SELECT COUNT(S_NM) FROM '||lc_s_d_tb_nm||' 
   WHERE S_NM = :s_nm
AND '||lc_s_t_col||'= :s_type'  into lc_s_count  USING in_s_nm,in_s_type;

DEMO

答案 1 :(得分:1)

只需使用replace(in_s_nm, '''', '''''')代替in_s_nm

答案 2 :(得分:0)

Oracle在10g中引入了Quote Operator作为替代或扩展,它至少消除了大部分(如果不是全部)双引号问题。例如,尝试:

select q'/this is a single quote ', and this a double '' and even a triple '''/' from dual
union all 
select 'this is a single quote '', and this a double '''' and even a triple ''''''' from dual;

我认为您会发现前者比后者更容易处理,尽管它们产生相同的结果。