TL;DR:set define off
在运行查询之前(可能)。
句点 ( .
) 不是特殊字符。您拆分和连接值的方式让我想知道您是否真的在 SQL*Plus 或 SQL Developer(或其他客户端)中看到了替换变量问题,因为消失-尽管不是在您的特定情况下。&
.
句点可以标记替换变量的结束,如果下一个字符是字符串的一部分,则需要句点,因此如果您有:
select 'R&Ddept' from dual;
那么整个 'Ddept' 将被视为替换变量:
Enter value for ddept: D
old 1: select 'R&Ddept' from dual
new 1: select 'RD' from dual
'R
--
RD
要使成为D
替换变量并将 'dept' 保留为固定字符串,请用句点分隔变量:
select 'R&D.dept' from dual;
Enter value for d: D
old 1: select 'R&D.dept' from dual
new 1: select 'RDdept' from dual
'RDDEP
------
RDdept
但是,如果您还希望实际显示一个句点,则需要添加一个额外的句点,以说明被替换处理吞下的句点:
select 'R&D..dept' from dual;
Enter value for d: D
old 1: select 'R&D..dept' from dual
new 1: select 'RD.dept' from dual
'RD.DEP
-------
RD.dept
显然,这仅适用于您确实想要替换的情况,当然&
在任何这些情况下,最终字符串中都不会出现。&
在你的情况下(对我来说)更令人困惑的是,在和之间有一个空格.
意味着它无论如何都不会被视为分隔符;因为'ATTRIBUTE_TYPE.R&D GMD NO.'
只有 the&D
被视为替换,而 the.
则保持原样。我猜你以更短的值到达了这一点。
您可能想要在这里实现的是完全避免替换。你这样做的方式,拆分字符串以便&
单独看到并且看不到替换,当然是一种方法,但很痛苦,特别是如果你不一定控制正在使用的字符串或有多个值。
至少还有两种其他方式;和:set escape
_set define
set escape '\'
select 'ATTRIBUTE_TYPE.R\&D GMD NO.' from dual;
这为 SQL*Plus 会话定义了一个转义字符,然后您可以将该字符放在 & 符号之前 - \&
- 因此它不会被视为替换变量。但是您仍然必须修改原始字符串,这并不理想。
set define off
select 'ATTRIBUTE_TYPE.R&D GMD NO.' from dual;
这完全禁用了替换,因此原始字符串保持不变。这通常是最简单的方法。您可以在脚本中根据需要打开和关闭它;如果您有一个语句需要在某些地方进行替换,但也有想要保留的 & 符号,您可以恢复到转义机制,或定义不同的替换字符,只要您能找到其他您永远不需要的东西逃离。
(您可能还会看到对set scan off
; 这的引用早于set define
并且已经过时,所以不要在新代码中使用它)。