PL/SQL,如何转义字符串中的单引号?

问题描述 投票:0回答:6

在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-database plsql
6个回答
259
投票

您可以使用文字引用:

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

文字文档可以在这里找到

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

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

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


38
投票

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

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

最简单、最常用的方式就是使用一个单引号,两边各有两个单引号。

SELECT 'test single quote''' from dual;

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

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

这是Oracle中打印单引号最简单的方法。但是,当您必须打印一组引号而不是一个引号时,事情就会变得复杂。在这种情况下,以下方法效果很好。但它需要更多的打字劳动。


22
投票

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

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


2
投票

就我而言,我这样使用:

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

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

这是另一个参考:字符串文字的替代引用机制(''Q'')


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'
;请记住,如果您使用
using
来执行带有参数的 DDL,则
EXECUTE IMMEDIATE
关键字将不起作用,但是,使用引号将适用于 DDL。


0
投票
stmt := Q'[insert into MY_TBL (Col) values('ER0002')]';
stmt := Q'(insert into MY_TBL (Col) values('ER0002'))';
stmt := Q'{insert into MY_TBL (Col) values('ER0002')}';
stmt := Q'!insert into MY_TBL (Col) values('ER0002')!';
stmt := Q'<insert into MY_TBL (Col) values('ER0002')>';
© www.soinside.com 2019 - 2024. All rights reserved.