我有以下查询:
select XMLType('<root>
<TPL>
<fld>f7</fld><val>v1v2</val>
</TPL>
</root>') from dual;
当我执行上面的查询,它执行完全正常,我得到以下输出:
<root>
<TPL>
<fld>f7</fld><val>v1v2</val>
</TPL>
</root>
但是当我执行以下(这是我的要求)时:
select XMLType('<root>
<TPL>
<fld>f7</fld><val>v1&v2</val>
</TPL>
</root>') from dual;
我被要求在弹出屏幕中输入'&'的值。
我尝试了以下两种方式:
select XMLType('<root>
<TPL>
<fld>f7</fld><val>v1&v2</val>
</TPL>
</root>') from dual;
select XMLType('<root>
<TPL>
<fld>f7</fld><val>v1''&''v2</val>
</TPL>
</root>') from dual;
但是仍然无法正确获取OUTPUT:
<root>
<TPL>
<fld>f7</fld><val>v1&v2</val>
</TPL>
</root>
我怎样才能实现这一目标?
这里有两个问题 - &
是Oracle SQL和XML中的一个特殊字符,它必须在两者中进行转义。 cdb_dba给出了一些如何在SQL中对它进行转义的例子(CHR(38)
或者在字符串的末尾),mkuligowski给出了如何在XML(&
或CDATA)中转义它的示例,但这两种转义需要合并。这里有几个例子:
-- with CHR() + CDATA
select XMLType('<root>
<TPL>
<fld>f7</fld><val><![CDATA[v1'|| chr(38) || 'v2]]></val>
</TPL>
</root>') from dual;
-- with ampersand at the end of a string + "amp" character reference
select XMLType('<root>
<TPL>
<fld>f7</fld><val>v1&' || 'amp;v2</val>
</TPL>
</root>') from dual;
而不是使用v1''&''v2
或v1&v2
,尝试使用v1'|| chr(38) || 'v2
或'v1 &'||'v2'
chr(38)是&符号的ASCII,第二个选项只是一种不同的连接方法。希望这可以帮助!
我打赌你在查询时使用的是SQLDeveloper。尝试运行SET DEFINE OFF;
,系统不会提示您输入值。
此外,当您创建XMLType
对象时,您应该转义非法字符,因此以下将工作:
SET DEFINE OFF;
select XMLType('<root>
<TPL>
<fld>f7</fld><val>v1&v2</val>
</TPL>
</root>') from dual;
另一方面,你总是可以在CDATA
中包装非法字符:
select XMLType('<root>
<TPL>
<fld>f7</fld><val><![CDATA[v1&v2]]></val>
</TPL>
</root>') from dual;