从XML数据中迭代并更新表

时间:2016-01-19 13:41:17

标签: sql xml oracle oracle11g

我有一个名为customer的表格,我有idsortcodename列。

我还有一个名为tblxml的表,它有一个名为xmlData的CLOB类型的列,它存储XML数据。

我已按如下方式存储XML数据:

 <root>
    <nd>
        <id>1</id>
        <sc>001</sc>
    </nd>
    <nd>
        <id>2</id>
        <sc>001001</sc>
    </nd>
    <nd>
        <id>11</id>
        <sc>001001001</sc>
    </nd>
    <nd>
        <id>16</id>
        <sc>001001001001</sc>
    </nd>
    <nd>
        <id>13</id>
        <sc>001001002</sc>
    </nd>
    <nd>
        <id>9</id><sc>001002</sc>
    </nd>
    <nd>
        <id>14</id>
        <sc>001002001</sc>
    </nd>
    </root>

我已将它对齐,因此很容易理解。

我需要:

  • tblxml中提取此XML数据并在customer中更新 表
  • Id表中提取tblxml并更新{id}中与{id}匹配的sortcode
  • 根据id。
  • 循环更新排序码中的XML数据

我已使用customer分隔行。

由于我是Oracle的新手,我还没有尝试过编码。期待一些建议。

2 个答案:

答案 0 :(得分:1)

with sample_data as (select '<root><nd> <id>1</id> <sc>001</sc> </nd> <nd> <id>2</id> <sc>001001</sc> </nd> <nd> <id>11</id> <sc>001001001</sc> </nd> <nd> <id>16</id> <sc>001001001001</sc> </nd> <nd> <id>13</id> <sc>001001002</sc> </nd> <nd> <id>9</id><sc>001002</sc> </nd> <nd> <id>14</id> <sc>001002001</sc> </nd></root>' xdata from dual) -- end of mimicking a table called "sample_data" containing your xml data. See the main SQL below: select id, sc from sample_data sd cross join xmltable('/root/nd' passing xmltype(sd.xdata) columns id number path 'id', sc varchar2(10) path 'sc'); ID SC ---------- ---------- 1 001 2 001001 11 001001001 16 0010010010 13 001001002 9 001002 14 001002001 之类的声音就像你之后的那样:

byteArray

一旦有了从xml列中提取结果的查询,就可以将其用作更新或合并语句的一部分来进行必要的更新。这是留给你的练习 - 在StackOverflow和Google中有很多例子!如果您遇到困难,请随时使用您尝试过的内容更新您的问题。

答案 1 :(得分:0)

我已经解决了这个问题。

  • 创建名为 TMP_XML 的新临时表,它有一列 hold_xml
  • tblxml 中的xml内容插入 TMP_XML
  • 然后从 TMP_XML 中提取值,如下所示,并根据匹配的 Id 更新 sortcode

      Insert    InTo TMP_XML
      Select    XmlType(PkgCBDmlXml.ExtractNodeValues(xmlData, 'root'))
        From    tblxml; 
    
      update    customer 
         set    sortcode =  (   Select  ExtractValue(Value(E),'//sc') Sc_New
                                From TMP_XML A,
                                TABLE(XmlSequence(Extract(A.hold_xml, '//nd'))) E
                                Where ExtractValue(Value(E),'//id') = id     
                                )