如何使用Oracle Query从表中的xmldata列提取xml值

fslejnso  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(202)

我有表xx_xml_data_table

标识XMLDATA创建日期XML请求标识

1 2022年1月10日11386 2 2022年1月10日11386
我有这样的xml数据

<?xml version="1.0"?>
<COLLECTIONSET><PARTY_ID>123</PARTY_ID><ACCOUNT_ID>456</ACCOUNT_ID><LOCATION_ID>789</LOCATION_ID><CONTACT_ID>090</CONTACT_ID>
 <COLLECTION>
  <CURRSYSDATE>11/15/2022</CURRSYSDATE>
  <FIRST_NAME>FNAME</FIRST_NAME>
  <LAST_NAME>LNAMEt</LAST_NAME>
  <PAYMENT_HISTORY>
   <PAYMENT_HISTORY_ROW>
    <INVOICE_NUMBER>inv0001</INVOICE_NUMBER>
    <PAY_STATUS>OPEN</PAY_STATUS>
    <AMOUNT_DUE_ORIGINAL>123</AMOUNT_DUE_ORIGINAL>
    <AMOUNT_DUE_REMAINING>100</AMOUNT_DUE_REMAINING>
    <INVOICE_CURRENCY_CODE>INR</INVOICE_CURRENCY_CODE>
    <ACCTD_AMOUNT_DUE_REMAINING>100</ACCTD_AMOUNT_DUE_REMAINING>
    <FUNCTIONAL_CURRENCY>INR</FUNCTIONAL_CURRENCY>
    <DUE_DAYS>17</DUE_DAYS>
    <DUE_DATE>29-OCT-2022</DUE_DATE>
   </PAYMENT_HISTORY_ROW>
   <PAYMENT_HISTORY_ROW>
    <INVOICE_NUMBER>inv0002</INVOICE_NUMBER>
    <PAY_STATUS>OPEN</PAY_STATUS>
    <AMOUNT_DUE_ORIGINAL>555</AMOUNT_DUE_ORIGINAL>
    <AMOUNT_DUE_REMAINING>200</AMOUNT_DUE_REMAINING>
    <INVOICE_CURRENCY_CODE>INR</INVOICE_CURRENCY_CODE>
    <ACCTD_AMOUNT_DUE_REMAINING>200</ACCTD_AMOUNT_DUE_REMAINING>
    <FUNCTIONAL_CURRENCY>INR</FUNCTIONAL_CURRENCY>
    <DUE_DAYS>17</DUE_DAYS>
    <DUE_DATE>29-OCT-2022</DUE_DATE>
   </PAYMENT_HISTORY_ROW>
  </PAYMENT_HISTORY>
 </COLLECTION>
</COLLECTIONSET>

我尝试了以下查询,但无效:

WITH inv AS
     (SELECT xt2.INVOICE_NUMBER,
             t.ID
           FROM xx_xml_data_table t,
        XMLTABLE('/COLLECTIONSET/COLLECTION/PAYMENT_HISTORY/PAYMENT_HISTORY_ROW' PASSING t.XMLDATA
                 COLUMNS "INVOICE_NUMBER" VARCHAR2(40)  PATH '@INVOICE_NUMBER' ) xt2
        where  t.XML_REQUEST_ID IN (11386,11387))
SELECT * FROM inv;

我需要这样的结果:
发票标识_编号1发票0001 1发票0002 2发票4001 2发票4002
有人能帮我吗。

5sxhfpxr

5sxhfpxr1#

在 示例 XML 中 , INVOICE_NUMBER 是 节点 , 而 不是 属性 , 因此 路径 应该 是 'INVOICE_NUMBER' 而 不是 '@INVOICE_NUMBER'
您 还 可以 简化 一 点 - 您 似乎 不 需要 CTE :

SELECT xt2.INVOICE_NUMBER,
       t.ID
  FROM xx_xml_data_table t,
       XMLTABLE(
         '/COLLECTIONSET/COLLECTION/PAYMENT_HISTORY/PAYMENT_HISTORY_ROW'
         PASSING t.XMLDATA
         COLUMNS "INVOICE_NUMBER" VARCHAR2(40) PATH 'INVOICE_NUMBER'
       ) xt2
WHERE t.XML_REQUEST_ID IN (11386,11387);

中 的 每 一 个
| 发票 编号|识别 码|
| - -| - -|
| 编号 0001|一 个|
| 编号 0002|一 个|
fiddle 的 最 大 值
如果 您 的 XMLDATA 列 被 定义 为 字符 串 ( varchar2clob ) , 则 需要 在 PASSING 子句 中 将 其 转换 为 XMLType ;否则 , 您 将 得到 一 个 错误 , 可能 是 ORA - 00932 或 ORA - 19224 或 其他 错误 , 具体 取决 于 实际 的 数据 类型 ;所以 你 会 这样 做 :

SELECT xt2.INVOICE_NUMBER,
       t.ID
  FROM xx_xml_data_table t,
       XMLTABLE(
         '/COLLECTIONSET/COLLECTION/PAYMENT_HISTORY/PAYMENT_HISTORY_ROW'
         PASSING XMLType(t.XMLDATA)
         COLUMNS "INVOICE_NUMBER" VARCHAR2(40) PATH 'INVOICE_NUMBER'
       ) xt2
WHERE t.XML_REQUEST_ID IN (11386,11387);

格式
| 发票 编号|识别 码|
| - -| - -|
| 编号 0001|一 个|
| 编号 0002|一 个|
fiddle 格式

相关问题