【问题标题】:ORA-00917 Escaping apostrophe in sql queryORA-00917 在 sql 查询中转义撇号
【发布时间】:2018-03-17 06:57:48
【问题描述】:

以下代码适用于大多数情况。 当 LIB_SEGCO 有任何单引号时它会爆炸 比如ABC'DEF

在这些情况下,它会给出错误 ORA-00917: missing comma

req := 'INSERT INTO CLIENTS(
                    IDEVT,
                    ID_CLIENT,
                    CATEGORIE_CLIENT,
                    SEGCO,
                    LIB_SEGCO,
                    NOM,
                    ADRESSE,
                    CODE_POSTAL,
                    VILLE,
                    PAYS,
                    STATUT) 
                    values(''' || UNID ||''','''||ID||''','''||SEGCO||''','''||L_SEGCO ||''','''||**LIB_SEGCO** ||''','''|| NOM||''','''||
                    ADRESSE||''','''||CODE_POSTAL||''','''||cVILLE||''','''||PAYS||''','''||CODE_STATUT||''')';

         execute immediate req;

有什么想法可以在传入变量时避开撇号?

谢谢

【问题讨论】:

  • 在这个特定的演示案例中绝对不需要使用动态 SQL。使用静态INSERT 语句。变量 UNID, ID, .... 已被 PL/SQL 引擎视为绑定变量。

标签: sql oracle plsql oracle11g oracle-sqldeveloper


【解决方案1】:

用途:

req := q'{INSERT INTO CLIENTS(
                    IDEVT,
                    ID_CLIENT,
                    CATEGORIE_CLIENT,
                    SEGCO,
                    LIB_SEGCO,
                    NOM,RCS_ADRESSE,
                    CODE_POSTAL,
                    VILLE,
                    PAYS,
                    STATUT) 
                    values( :1, :2, :3, :4, :5, :6
                             :7, :8, :9, :10)}';

         execute immediate req
         USING  UNID  , ID , SEGCO , L_SEGCO  , LIB_SEGCO ,
                NOM , ADRESSE , CODE_POSTAL , cVILLE , PAYS ;

注意:我省略了, CODE_STATUT,因为 INSERT 命令中只列出了 10 列,但 CODE_STATUT 排在第 11 位,因此列数与值数不匹配。

【讨论】:

  • @O.Sam - 这不是“一劳永逸”的事情。记住这一点,以备将来之需。技术名称是“ q 引用机制” - 不是单引号,而是将整个字符串括在 q'{ ... }'q'# ... #' 等内。然后你不需要转义字符串中的单引号。有关详细信息,请参阅docs.oracle.com/cd/B19306_01/server.102/b14200/…
猜你喜欢
  • 2015-11-21
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
相关资源
最近更新 更多