有没有办法在Oracle中引用包含撇号的SQL字符串以避免需要转义撇号?

Luk*_*der 1 sql oracle plsql escaping

我在PL/SQL中编写了很多动态SQL:

-- Let's assume the query is much more complex and bind variables are not a solution here
EXECUTE IMMEDIATE 'INSERT INTO foo (col) VALUES (''somevalue'')';
Run Code Online (Sandbox Code Playgroud)

观察令人讨厌的转义撇号重复以形成有效的SQL/PL/SQL语法.有什么方法可以引用SQL字符串文字,这样我就不用再逃避了吗?将SQL字符串从实际执行复制粘贴到PL/SQL程序中会很好,而不需要对撇号进行繁琐的修补.

(我故意在这里问这个问题,用我自己的答案记录引用功能)

Luk*_*der 9

自Oracle 10g称为"引用字符串文字"以来,有一个鲜为人知的特性.你可以写:

EXECUTE IMMEDIATE q'[INSERT INTO foo (col) VALUES ('somevalue')]';
Run Code Online (Sandbox Code Playgroud)

您支付的价格是您的字符串文字不再包含,]因为它现在是字符串终止令牌的一部分.以这种方式使用的可能字符是:

  • q'! ... !'
  • q'[ ... ]'
  • q'{ ... }'
  • q'( ... )'
  • q'< ... >'

更多信息: