您的过程参数是 XMLtype,它自动编码来自 predefined XML entities list 的单引号和双引号
SQL> select xmltype('<test>6''4"</test>') from dual;
XMLTYPE('<TEST>6''4"</TEST>')
--------------------------------------------------------------------------------
<test>6'4"</test>
这与 HTML 无关;其他非 XML HTML entities 未编码。你看到的是正确的;实体应该在您的 XMLType 对象中进行编码。
如果您想查看已解码的实体,可以使用已弃用的 extractvalue 函数:
SQL> select extractvalue(xmltype('<test>6''4"</test>'), '/test') from dual;
EXTRACTVALUE(XMLTYPE('<TEST>6''4"</TEST>'),'/TEST')
--------------------------------------------------------------------------------
6'4"
或一个 XMLQuery,使用 XMLCast 进行解码,作为转换为纯字符串的一部分:
SQL> select xmlcast(xmlquery('/test/text()' passing xmltype('<test>6''4"</test>')
2 returning content) as varchar2(10)) from dual;
XMLCAST(XM
----------
6'4"
根据您在程序中使用数据的方式,您可以使用extract() 将表单更改为xmlcast(xmlquery(...) as ...)。你不能在 PL/SQL 中本地调用它(据我所知),所以你需要一个上下文切换来从 dual 中进行选择;而且它似乎也不喜欢在命令中连接索引值 - 不太清楚为什么,但我不得不使用一个变量来保存构造的 XPath。
作为一个例子,如果你有类似的东西 - 在你的真实案例中将值传递给你的过程 - 你仍然有编码的值:
DECLARE
ncoXml XMLType := XMLType(q'[<victims><victim index="1"><name>Peter O'Toole</name></victim></victims>]');
victimIndex pls_integer := 1;
victimName varchar2(200);
BEGIN
victimName := SUBSTR(ncoXml.EXTRACT('/victims/victim[@index="'
|| TO_CHAR(victimIndex) || '"]/name/text()').GETSTRINGVAL(), 1, 200);
dbms_output.put_line(victimName);
END;
/
Peter O'Toole
XMLCast 变体可能如下所示:
DECLARE
ncoXml XMLType := XMLType(q'[<victims><victim index="1"><name>Peter O'Toole</name></victim></victims>]');
victimIndex pls_integer := 1;
victimName varchar2(200);
xPath varchar2(200);
BEGIN
xPath := '/victims/victim[@index="' || victimIndex || '"]/name/text()';
select xmlcast(xmlquery(xPath passing ncoXml returning content) as varchar2(200))
into victimName
from dual;
dbms_output.put_line(victimName);
END;
/
Peter O'Toole