如何在XMLTYPE内获取&值

时间:2019-03-19 13:29:41

标签: oracle plsql xmltype

我有以下查询:

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>

我该如何实现?

3 个答案:

答案 0 :(得分:1)

这里有两个问题-& Oracle SQL和XML中都是一个特殊字符,必须在两者中都进行转义。 cdb_dba给出了一些如何在SQL中进行转义的示例(CHR(38)或字符串末尾的&),而mkuligowski给出了一些如何以XML进行转义的示例(&amp;或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;

答案 1 :(得分:0)

请尝试使用v1''&''v2v1&amp;v2而不是使用v1'|| chr(38) || 'v2'v1 &'||'v2'

chr(38)是ampstand的ASCII,第二个选择只是一种不同的连接方法。希望这会有所帮助!

答案 2 :(得分:0)

我敢打赌,查询时您正在使用SQLDeveloper。尝试运行backend: container_name: backend_dev_blog build: ./backend command: "sh -c /start_dev.sh" user: root volumes: - ./backend:/backend ports: - "8000:8000" networks: - main environment: - DB_HOST=db - DB_NAME=blog - DB_USER=postgres - DB_PASS=supersecretpassword depends_on: - db ,将不会提示您输入值。

此外,当您创建SET DEFINE OFF;对象时,您应该转义非法字符,因此可以进行以下操作:

XMLType

另一方面,您始终可以将非法字符包装在SET DEFINE OFF; select XMLType('<root> <TPL> <fld>f7</fld><val>v1&amp;v2</val> </TPL> </root>') from dual; 中:

CDATA