执行立即变量中的单引号 - 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的主要内容,如果未能解决你的问题,请参考以下文章

shell 字符串

MySQL中的单引号和双引号

MySQL中的单引号和双引号

shell中的单引号,双引号,反引号

SQL语言中的单引号与双引号区别

Linux 命令中的单引号,不加任何参数以及双引号的作用