Oracle SQL转义字符(用于“&”)

103

在使用Oracle SQL Developer执行SQL插入语句时,我不断地生成“输入替换值”提示:

insert into agregadores_agregadores 
(
 idagregador,
 nombre,
 url
) 
values 
(
 2,
 'Netvibes',
 'http://www.netvibes.com/subscribe.php?type=rss\&url='
);

我尝试使用上面的 '\' 转义特殊字符来转义查询中的特殊字符,但仍无法避免"&"这个符号引起字符串替换。

8个回答

145

&DEFINE的默认值,它允许您使用替换变量。 我喜欢使用以下方法将其关闭:

SET DEFINE OFF

那么你就不必担心转义或使用 CHR(38)。


73

|| chr(38) ||

这个解决方案非常完美。


3
这可以完成任务,但在处理现有字符串时可能会有些笨拙。 - aglassman
对我来说,SET DEFINE OFF 没有起作用。你的解决方案很好用。谢谢... - Ashok kumar
我在哪里可以找到chr()字符的完整列表?我的问题类似,但在我的情况下,我正在寻找转义一个(')字符。 - grego
@user7587050 你可以使用任何ASCII表。它们可以在互联网上轻松找到,例如在维基百科上 https://en.wikipedia.org/wiki/ASCII - Frank Schmitt

33

将define字符设置为某些不同于&的字符

SET DEFINE ~
创建表blah(x varchar(20));
插入到blah(x)中的值为('blah&amp');
从blah中选择*;
X -------------------- blah&amp

17
insert into AGREGADORES_AGREGADORES (IDAGREGADOR,NOMBRE,URL)
values (2,'Netvibes',
'http://www.netvibes.com/subscribe.php?type=rss' || chr(38) || 'amp;url=');

这是一个更好的通用解决方案,独立于用户权限(即当用户不允许 SET DEFINE OFF 时)并且当用户想要在同一 SQL 命令中指定文本中的两个“&”和定义变量时。 - Fuzzy Analysis

17
SELECT 'Free &' || ' Clear' FROM DUAL;

7

select 'one'||'&'||'two' from dual


1
& 符号只需要出现在字符串的末尾,可以节省一半的连接操作。select 'one&' || 'two' from dual - durette

1
真正的答案是你需要将转义字符设置为“\”: SET ESCAPE ON
问题可能是由于禁用转义或将转义字符设置为其他字符引起的。上述语句将启用转义并将其设置为“\”。

之前发布的其他答案实际上都没有回答原始问题。它们都是绕过问题而不是解决它。


5
我在 Ask Tom(https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1629001802771)上读到:“SET ESCAPE 是 sqplus 的专用语”。所以,只有当问题涉及 SQL*Plus 时,这才是正确的答案。 - Karl Kieninger
1
@KarlKieninger: 在很大程度上,你是对的。但是替代变量的整个概念也是 sqlplus 的一种特殊用法。既然 SQL Developer 能够识别 & 作为替代变量(这是 sqlplus 的一种特殊用法),我不会对它能够识别 SET ESCAPE 命令(另一种 sqlplus 特殊用法)感到惊讶。根据 SQL Developer 用户指南,其 "脚本运行器" 确实识别了一组有限的 SQL*Plus 功能,包括替代变量(至少在版本 19 中如此)。然而,当我尝试使用 SET ESCAPE 时,它会给出错误消息。但它接受了 SET DEFINE OFF。越来越奇怪了。 - Syntax Junkie

0

在您的请求之前添加此内容

set define off;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接