【问题标题】:Single quote in execute immediate variable - Oracle PLSQL执行立即变量中的单引号 - 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 无法正常工作。

我怎样才能修复它以使其正常工作?

【问题讨论】:

标签: oracle 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;
    

    我认为你会发现第一个比第二个更容易处理,尽管它们产生相同的结果。

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 1970-01-01
      • 2011-06-15
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多