PL/SQL,如何在字符串中转义单引号?
Posted
技术标签:
【中文标题】PL/SQL,如何在字符串中转义单引号?【英文标题】:PL/SQL, how to escape single quote in a string? 【发布时间】:2012-07-03 16:36:02 【问题描述】:在 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;
/
【问题讨论】:
Escaping single quote in 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
【讨论】:
以上是关于PL/SQL,如何在字符串中转义单引号?的主要内容,如果未能解决你的问题,请参考以下文章