首页 > 解决方案 > 从 PL/SQL 中的 XMLType 而不是表中提取 CLOB 中的节点值

问题描述

假设我将以下 XML 数据分配给 CLOB 类型的 PL/SQL 中的局部变量,即:

l_clob := ‘<xml>
  <ticket_order>
    <table_no>1<table_no/>
    <waiter>Jack<waiter/>
    <total_people>12<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>4<table_no/>
    <waiter>Jackie<waiter/>
    <total_people>3<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>2<table_no/>
    <waiter>Sally<waiter/>
    <total_people>2<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>11<table_no/>
    <waiter>Mike<waiter/>
    <total_people>6<total_people/>
  </ticket_order>
</xml>';

因此,我不会将此 XML 存储在表列中,因为我想单独在我的 PL/SQL 包过程中进行处理。

使用上面的l_clob变量,我然后执行以下操作:

retrieve_all_table_no(p_response => SYS.XMLTYPE.CREATEXML(l_clob));

现在在我的程序中:

retrieve_all_table_no(p_response in XMLType)

如何逐行提取其中的所有节点值<table_no>

同样,这不是来自表,而是在 PL/SQL 中动态完成的。

我希望能够访问每个单独的值,以便我处理,即:

1
4
2
11

我不能使用提取,因为这将连接所有值。

标签: plsqloracle11gextractoracle-xml-db

解决方案


解决了这个问题,我在添加到我的程序时会改变它,但这达到了我想要的结果。

l_xmlType   XMLTYPE;

l_xmltype := SYS.XMLTYPE.CREATEXML(l_clob);  -- l_clob value from above

select x.*
from xmltable('xml/ticket_order'
    passing l_xmltype
    columns table_no number path 'table_no'
) x;

推荐阅读