在 PL/SQL 中删除 xml 节点
Posted
技术标签:
【中文标题】在 PL/SQL 中删除 xml 节点【英文标题】:Deleting xml node in PL/SQL 【发布时间】:2013-04-11 14:12:57 【问题描述】:如何使用 PL/SQL 从 xmltype 中删除节点?示例:
<people>
<person>
<personNO>1</personNO>
</person>
<person>
<personNO>2</personNO>
</person>
</people>
如果 /people/person/personNO 为 1,我会尝试删除整个节点 person。我的 xml 文档位于 l_xml xmltype 变量中。到目前为止,我得到了:
SELECT deletexml(l_xml, '/people/person[personNO="1"]')
INTO l_xml
FROM dual;
它似乎根本不起作用。您能提出任何解决方案吗?
【问题讨论】:
【参考方案1】:定义“根本不起作用”,因为它会正常工作:
(在 10.2.0.4 + 11.2.0.3 上测试)
SQL> declare
2 l_xml xmltype;
3 begin
4
5 l_xml := xmltype.createXML('<people>
6 <person>
7 <personNO>1</personNO>
8 </person>
9 <person>
10 <personNO>2</personNO>
11 </person>
12 </people>');
13
14 select deletexml(l_xml, '/people/person[personNO="1"]')
15 into l_xml
16 from dual;
17
18 dbms_output.put_line(l_xml.getstringval());
19 end;
20 /
<people><person><personNO>2</personNO></person></people>
PL/SQL procedure successfully completed.
因此删除了 person no = 1 的整个 person 节点。如果您打算清除每个节点(如果 personNO 1 存在于其中任何一个节点中),那么您希望将 xpath 设置为 /people/person[../person/personNO="1"]
【讨论】:
这很奇怪,因为“根本不起作用”我的意思是“完全什么都不做”。对我来说,那段代码没有给出想要的输出。 @Jandrejc - 没有提供所需的输出,或者没有提供任何输出?您是否打开了服务器输出以便看到dbms_output
? (set serveroutput on
在 SQL*Plus 中)
不提供所需的输出。它给了我原始的 xml,带有应该被删除的节点。
@Jandrejc 建议您需要 Oracle 支持来查看一个错误。你在哪个oracle版本上?我假设您的真实 XML 不使用命名空间,因为如果使用,您需要声明它们以使 xpath 正确匹配节点。以上是关于在 PL/SQL 中删除 xml 节点的主要内容,如果未能解决你的问题,请参考以下文章
oracle的PL/SQL中如何根据节点名称直接获取xml某个节点的值