144

在 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;
/
4

5 回答 5

224

您可以使用文字引用:

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

可以在此处找到文字的文档。

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

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

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

于 2012-07-03T16:38:44.143 回答
28

这是一篇博客文章,应该有助于转义字符串中的刻度。

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

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

SELECT 'test single quote''' from dual;

上述语句的输出将是:
test single quote'

简单地说您需要一个额外的单引号字符来打印单引号字符。也就是说,如果您输入两个单引号字符,Oracle 将打印一个。第一个行为就像一个转义字符。

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

于 2012-07-03T18:37:19.490 回答
17

除了上面 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;

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

于 2018-02-09T05:39:13.423 回答
0

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

于 2020-03-31T20:01:28.860 回答
-1

就我而言,我这样使用:

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

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

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

于 2021-05-22T06:48:37.787 回答