我有一个存储过程,它具有:
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无法正常工作。
我如何解决它才能起作用?
答案 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;
答案 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;
我认为您会发现前者比后者更容易处理,尽管它们产生相同的结果。