我有以下查询:
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;
但仍然无法正确获取输出,该输出应该是:
<root>
<TPL>
<fld>f7</fld><val>v1&v2</val>
</TPL>
</root>
我该如何实现?
答案 0 :(得分:1)
这里有两个问题-&
在和 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;
答案 1 :(得分:0)
请尝试使用v1''&''v2
或v1&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&v2</val>
</TPL>
</root>') from dual;
中:
CDATA