【问题标题】:Deleting xml node in PL/SQL在 PL/SQL 中删除 xml 节点
【发布时间】: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;

它似乎根本不起作用。您能提出任何解决方案吗?

【问题讨论】:

    标签: xml oracle plsql xmltype


    【解决方案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 正确匹配节点。
    猜你喜欢
    • 2020-06-18
    • 2023-02-03
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多