执行立即变量中的单引号 - Oracle PLSQL
Posted
技术标签:
【中文标题】执行立即变量中的单引号 - Oracle PLSQL【英文标题】:Single quote in execute immediate variable - Oracle PLSQL 【发布时间】:2019-06-04 08:40:52 【问题描述】:我有一个存储过程:
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 无法正常工作。
我怎样才能修复它以使其正常工作?
【问题讨论】:
Escaping single quote in PLSQL的可能重复 【参考方案1】:你应该停在那里.. 不要使用,我再说一遍,永远不要在动态 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
【讨论】:
可能只是您想使用 SQL 注入作为工具,在这种情况下使用连接是有意义的。顺便说一句,您也可以将WHERE S_NM IN (:s_nm)
改为WHERE S_NM = :s_nm
- 这让我一开始有点困惑,因为我认为您想将多个值传递给动态 sql。
它也被删除了。我应该更加熟悉使用 SO 移动应用程序:【参考方案2】:
只需使用replace(in_s_nm, '''', '''''')
而不是in_s_nm
。
【讨论】:
【参考方案3】:在 10g 中,Oracle 引入了 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;
我认为你会发现第一个比第二个更容易处理,尽管它们产生相同的结果。
【讨论】:
以上是关于执行立即变量中的单引号 - Oracle PLSQL的主要内容,如果未能解决你的问题,请参考以下文章