【问题标题】:PL/SQL, how to escape single quote in a string?PL/SQL,如何在字符串中转义单引号?
【发布时间】:2012-07-04 03:30:42
【问题描述】:

在 Oracle PL/SQL 中,如何转义字符串中的单引号?我试过这种方法,它不起作用。

declare
  stmt varchar2(2000);
begin
  for i in 1021 .. 6020
  loop
    stmt := 'insert into MY_TBL (Col) values(\'ER0002\')';

    dbms_output.put_line(stmt);
    execute immediate stmt;
    commit;
  end loop;
exception
  when others then
    rollback;
    dbms_output.put_line(sqlerrm);
end;
/

【问题讨论】:

标签: oracle plsql


【解决方案1】:

你可以使用文字引用:

stmt := q'[insert into MY_TBL (Col) values('ER0002')]';

文字文档can be found here

或者,您可以使用两个引号来表示单引号:

stmt := 'insert into MY_TBL (Col) values(''ER0002'')';

IMO 使用 Q 语法的文字引用机制更加灵活和易读。

【讨论】:

    【解决方案2】:

    这里是a blog post,它应该有助于转义字符串中的记号。

    这是上述帖子中最简单的方法:

    最简单也最常用的方法是用单引号,两边加两个单引号。

    SELECT 'test single quote''' from dual;

    上述语句的输出将是:
    测试单引号'

    只是说明您需要一个额外的单引号字符来打印单引号字符。也就是说,如果您输入两个单引号字符,Oracle 将打印一个。第一个类似于转义字符。

    这是在 Oracle 中打印单引号的最简单方法。但是当您必须打印一组引号而不是一个引号时,它会变得复杂。在这种情况下,以下方法可以正常工作。但这需要更多的打字工作。

    【讨论】:

      【解决方案3】:

      除了上面 DCookie 的回答,你还可以使用 chr(39) 作为单引号。

      当我必须基于大量现有数据创建大量插入/更新语句时,我发现这特别有用。

      这是一个非常简单的例子:

      假设我们有一个非常简单的表,Customers,它有 2 列,FirstName 和 LastName。我们需要将数据移动到Customers2中,所以我们需要生成一堆INSERT语句。

      Select 'INSERT INTO Customers2 (FirstName, LastName) ' ||
             'VALUES (' || chr(39) || FirstName || chr(39) ',' || 
             chr(39) || LastName || chr(39) || ');' From Customers;
      

      我发现这在将数据从一个环境移动到另一个环境或快速重建环境时非常有用。

      【讨论】:

        【解决方案4】:

        EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(''ER0002'')';为我工作。 用两对单引号关闭 varchar/string 就可以了。其他选项可能是使用using 关键字,EXECUTE IMMEDIATE 'insert into MY_TBL (Col) values(:text_string)' using 'ER0002';请记住 using 关键字不起作用,如果您使用 EXECUTE IMMEDIATE 执行带参数的 DDL,但是,使用引号将适用于 DDL。

        【讨论】:

          【解决方案5】:

          就我而言,我是这样使用的:

          stmt := q'!insert into MY_TBL (Col) values('ER0002')!';
          

          添加:q'! 之前和 !' 字符串之后。

          这是另一个参考:Alternative Quoting Mechanism (''Q'') for String Literals

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多