【问题标题】:XML Oracle : How to extrct parent node value using SQL QueryXML Oracle:如何使用 SQL 查询提取父节点值
【发布时间】:2017-09-24 18:04:06
【问题描述】:

我有以下 XML 数据:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE labels SYSTEM "label.dtd">
<labels _FORMAT="Receipt Test" _QUANTITY="1" _JOBNAME="LBL4001">
    <label>
        <variable name= "RECEIVE_DATE">25-APR-2017</variable>
        <variable name= "PO_NUM">12345</variable>
        <variable name= "QTY">1</variable>
        <variable name= "RECEIPT_NUM">128419</variable>
    </label>
</labels>

我需要使用 SQL 查询为 _FORMAT 提取值 Receipt Test

我已经编写了下面的查询,但它不工作,因为它返回空值。

SELECT TRIM (EXTRACTVALUE (VALUE (x), '//variable')) FROM (SELECT XMLTYPE (p_xml_content) xml FROM DUAL), 
        TABLE (XMLSEQUENCE (EXTRACT (xml, 'labels'))) x 
        WHERE UPPER (EXTRACTVALUE (VALUE (x), '//@name')) = '_FORMAT';

根据要求,此查询应返回“收据测试”值。请帮助我实现这一目标。

【问题讨论】:

  • 这里有问题吗? (“有人可以帮我写这个吗?” 不是问题。)
  • SELECT TRIM (EXTRACTVALUE (VALUE (x), '//variable')) FROM (SELECT XMLTYPE (p_xml_content) xml FROM DUAL), TABLE (XMLSEQUENCE (EXTRACT (xml, 'labels')) ) x WHERE UPPER (EXTRACTVALUE (VALUE (x), '//@name')) = '_FORMAT';
  • 我已经编写了上述查询,但它不起作用。请帮忙
  • 您应该将所有代码添加到问题中(您可以随时编辑您的帖子)。除了 SQL,还要写下它当前产生的结果以及您期望的结果。
  • 嗨 Tomalak,我已按要求编辑了我的帖子。谢谢

标签: sql xml oracle


【解决方案1】:

目前尚不清楚您的确切要求,但这有帮助..

SQL> with MY_XML_TABLE as
  2  (
  3  select XMLTYPE(
  4  '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  5  <!-- <!DOCTYPE labels SYSTEM "label.dtd"> -->
  6  <labels _FORMAT="Receipt Test" _QUANTITY="1" _JOBNAME="LBL4001">
  7      <label>
  8          <variable name= "RECEIVE_DATE">25-APR-2017</variable>
  9          <variable name= "PO_NUM">12345</variable>
 10          <variable name= "QTY">1</variable>
 11          <variable name= "RECEIPT_NUM">128419</variable>
 12      </label>
 13  </labels>') as XMLDOC
 14    from DUAL
 15  )
 16  select XMLCAST(
 17           XMLQUERY('$XML/labels[label/variable/@name=$VALUE]/@_FORMAT' passing XMLDOC as "XML", '_FORMAT' as "VALUE" returning content)
 18           AS VARCHAR2(32)
 19         ),
 20        XMLCAST(
 21           XMLQUERY('$XML/labels[label/variable/@name=$VALUE]/@_FORMAT' passing XMLDOC as "XML", 'QTY' as "VALUE" returning content)
 22           AS VARCHAR2(32)
 23         )
 24    from MY_XML_TABLE
 25  /

XMLCAST(XMLQUERY('$XML/LABELS[LA XMLCAST(XMLQUERY('$XML/LABELS[LA
-------------------------------- --------------------------------
                                 Receipt Test

SQL>

注意我必须注释掉 DTD。要使其与 DTD 一起工作,您需要将 DTD 加载到 XML DB 存储库的根目录中,或者在执行查询之前发出以下命令

   SQL> -- Turn off DTD Validation
   SQL> --
   SQL> alter session set events ='31156 trace name context forever, level 2'
     2  /

【讨论】:

  • 谢谢马克!!这对我帮助很大。
猜你喜欢
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多