【问题标题】:How to Add and Remove xml tags of existing data inside xmltype column in oracle如何在 oracle 的 xmltype 列中添加和删除现有数据的 xml 标签
【发布时间】:2016-05-09 23:35:19
【问题描述】:

我创建了下表:

这是 1 个数据行示例:

在该表中,SALPROFILE 列中,每列数据包含一个大的 xml 数据,如下示例:

<employee>
  <id>FMCSC00015</id>
  <year>2016</year>
  <month>1</month>
  <PAYMSTR_SALHDNM>BASIC PAY</PAYMSTR_SALHDNM>
  <PAYMSTR_AMOUNT>35600</PAYMSTR_AMOUNT>
  <PAYMSTR_SALHDNM>ASSOCIATION SUBSCRIPTION</PAYMSTR_SALHDNM>
  <PAYMSTR_AMOUNT>240</PAYMSTR_AMOUNT>
  <PAYMSTR_SALHDNM>TELEPHONE ALLOWANCE</PAYMSTR_SALHDNM>
  <PAYMSTR_AMOUNT>800</PAYMSTR_AMOUNT>
  <PAYMSTR_SALHDNM>HOUSE RENT DEDUCTION</PAYMSTR_SALHDNM>
  <PAYMSTR_AMOUNT>2587.5</PAYMSTR_AMOUNT>
  <PAYMSTR_SALHDNM>MEDICAL ALLOWANCE</PAYMSTR_SALHDNM>
  <PAYMSTR_AMOUNT>700</PAYMSTR_AMOUNT>
  <PAYMSTR_SALHDNM>GAS BILL</PAYMSTR_SALHDNM>
  <PAYMSTR_AMOUNT>450</PAYMSTR_AMOUNT>  
  <PAYMSTR_SALHDNM>LIFE INSURANCE PREMIUM (D)</PAYMSTR_SALHDNM>
  <PAYMSTR_AMOUNT>1718</PAYMSTR_AMOUNT>  
</employee>

我想从上面的示例中添加和删除 xml 标签。 例如,我想删除

<PAYMSTR_SALHDNM>BASIC PAY</PAYMSTR_SALHDNM>
      <PAYMSTR_AMOUNT>35600</PAYMSTR_AMOUNT>

我想添加

 <PAYMSTR_SALHDNM>BANK LOAN</PAYMSTR_SALHDNM>
  <PAYMSTR_AMOUNT>23490</PAYMSTR_AMOUNT>

我该怎么做。这是否可能在不跟踪整个 xml 数据的情况下做到这一点以使其更快。我看到 Appendchildxml function 已弃用

【问题讨论】:

    标签: xml oracle


    【解决方案1】:

    您可以通过AppendChildXMLdeleteXML 的方式添加/删除带有以下内容的标签来修改您的XML。

    在示例中,第一部分返回您的 XML 多一个标签,而第二列删除一个与 [...] 之间的条件匹配的标签:

    with xmlTab(val) as (
        select xmlType('<employee>
          <id>FMCSC00015</id>
          <year>2016</year>
          <month>1</month>
          <PAYMSTR_SALHDNM>BASIC PAY</PAYMSTR_SALHDNM>
          <PAYMSTR_AMOUNT>35600</PAYMSTR_AMOUNT>
          <PAYMSTR_SALHDNM>ASSOCIATION SUBSCRIPTION</PAYMSTR_SALHDNM>
          <PAYMSTR_AMOUNT>240</PAYMSTR_AMOUNT>
          <PAYMSTR_SALHDNM>TELEPHONE ALLOWANCE</PAYMSTR_SALHDNM>
          <PAYMSTR_AMOUNT>800</PAYMSTR_AMOUNT>
          <PAYMSTR_SALHDNM>HOUSE RENT DEDUCTION</PAYMSTR_SALHDNM>
          <PAYMSTR_AMOUNT>2587.5</PAYMSTR_AMOUNT>
          <PAYMSTR_SALHDNM>MEDICAL ALLOWANCE</PAYMSTR_SALHDNM>
          <PAYMSTR_AMOUNT>700</PAYMSTR_AMOUNT>
          <PAYMSTR_SALHDNM>GAS BILL</PAYMSTR_SALHDNM>
          <PAYMSTR_AMOUNT>450</PAYMSTR_AMOUNT>  
          <PAYMSTR_SALHDNM>LIFE INSURANCE PREMIUM (D)</PAYMSTR_SALHDNM>
          <PAYMSTR_AMOUNT>1718</PAYMSTR_AMOUNT>  
        </employee>')
        from dual
        )
        select APPENDCHILDXML( val,
                               'employee',
                               XMLType('<PAYMSTR_SALHDNM>SONALI BANK LOAN-4</PAYMSTR_SALHDNM>')
                             ) as APPEND,  
               DELETEXML(val,'/employee/PAYMSTR_AMOUNT[.="1718"]') AS DEL
        from xmlTab
    

    要添加的 XML 可以通过从另一个表中读取数据来动态构建,例如以这种方式:

    with test as 
    (
        select 'PAYMSTR_SALHDNM' tag, 'SONALI BANK LOAN-4' val from dual union all
        select 'PAYMSTR_SALHDNM' tag, 'GAS BILL' val from dual
    )     
    select XMLELEMENT(tag, val) from test
    

    【讨论】:

    • 谢谢@Aleksej。我想知道,而不是手动放置所有标签,我想从像这样的表中获取它们:select xmlType((select SALPROFILE from SALARYPROFILE where EMPID = 'FMCSC00015')) 但它显示错误wrong number or types of arguments in call to 'XMLTYPE'。所以请你帮我把它最小化。谢谢
    • xmlType() 仅将 varchar 转换为 Xml,但输入字符串必须是 XML 格式。您可以通过多种方式构建 XML,我已在我的回答中举例说明
    • 感谢@Aleksej 的快速回复。关于创建标签的很好解释。它几乎非常接近。但是,我的整个 xml 数据都在列SALPROFILE from table SALARYPROFILE where EMPID = 'FMCSC00015'.所以我想从表中获取它们并添加/删除它们。所以你能告诉我怎么做吗。谢谢
    • 如果您有要添加/删除的数据已经存储在 XML 中,我相信您只需要遍历节点并将它们添加到给定的 XML 或从给定的 XML 中删除它们;我们知道如何添加/删除;例如,可以使用this 之类的方式扫描节点。
    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多