Oracle 如何在XMLTYPE中获取符号和值

Oracle 如何在XMLTYPE中获取符号和值,oracle,plsql,xmltype,Oracle,Plsql,Xmltype,我有以下疑问: select XMLType('<root> <TPL> <fld>f7</fld><val>v1v2</val> </TPL> </root>') from dual; 当我执行上述查询时,它执行得非常好,我得到以下输出: <root> <TPL> <fld>f7</fld><val>v1v2&

我有以下疑问:

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&amp;v2</val>
  </TPL>
</root>') from dual;


select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1''&''v2</val>
  </TPL>
</root>') from dual;
但仍无法正确获取输出,应为:

<root>
  <TPL>
    <fld>f7</fld><val>v1&v2</val>
  </TPL>
</root>
如何实现这一点?

而不是使用v1&v2或v1&;v2,尝试使用v1'| | chr38 | | v2'或'v1&'| | |'v2'


chr38是用于安培表的ASCII码,第二个选项只是一种不同的连接方法。希望这有帮助

我打赌您在查询时使用的是SQLDeveloper。试运行设置定义关闭;并且不会提示您输入值

此外,在创建XMLType对象时,应该转义非法字符,因此以下操作将起作用:

SET DEFINE OFF;
select XMLType('<root>
 <TPL>
  <fld>f7</fld><val>v1&amp;v2</val>
 </TPL>
 </root>') from dual;

这里有两个问题-&在oraclesql和XML中都是一个特殊字符,在这两种语言中都必须转义。cdb_dba给出了一些如何在SQL CHR38或字符串末尾转义它的示例,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;

您没有说您使用的是什么客户机,但这些选项应该适用于大多数客户机:我使用Toad for Oracle我使用Toad for Oracle,而不是SQL DeveloperWell,我使用的是Oracle 11.0.0.116版,SET DEFINE OFF不起作用SET DEFINE是一个SQLPlus命令,必须使用脚本引擎F5执行。F9只执行单个语句,不处理SQLPlus。感谢所有的帮助。但是上面的解决方案都不起作用。很抱歉,这两种方法实际上都不起作用。谢谢您的澄清!我通常不处理XMLType数据,因此如果我碰巧发现自己在该领域,我会将其添加到我的注意事项列表中:
-- 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;