【问题标题】:Iterate from XML data and update the table从 XML 数据迭代并更新表
【发布时间】:2016-04-25 00:26:28
【问题描述】:

我有一个名为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 中更新它 表。
  • tblxml 表中提取Id 并更新customer 表中与id 匹配的sortcode
  • 循环XML数据,根据id更新排序码。

我使用&lt;nd&gt; 分隔行。

由于我是 Oracle 新手,因此我没有尝试过为此编写代码。期待一些建议。

【问题讨论】:

  • 大概你的实际 xml 包含一个根节点? (例如&lt;top&gt;&lt;nd&gt;..&lt;/nd&gt;...&lt;nd&gt;..&lt;/nd&gt;&lt;/top&gt;

标签: sql xml oracle oracle11g


【解决方案1】:

听起来XMLTABLE 是你所追求的:

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

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

【讨论】:

  • 谢谢。是否必须在 XML 数据的开头和结尾包含
  • 是的,否则它不是有效的xml!
  • 虽然它不必被称为 root,但你确实需要将所有节点集包含在一个外部节点中。当然,除非您的示例中的每个 都是其自己单独的 xml 文档?
  • 不是所有的 都在同一个 xml 文档中。我现在在开头和结尾添加了
【解决方案2】:

我已经解决了这个问题。

  • 创建了名为 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     
                                )   
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2011-04-29
    • 2020-06-02
    • 1970-01-01
    • 2016-03-16
    相关资源
    最近更新 更多