【问题标题】:Oracle XMLTYPE extract root prolog valueOracle XMLTYPE 提取根序言值
【发布时间】:2021-05-13 06:29:58
【问题描述】:
SELECT * FROM v$version;
*Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
"CORE   12.1.0.2.0  Production"
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production*

我有如下 XML 查询示例:

with t(xml) as 
(
select xmltype(
'<SSO_XML
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
TimeStamp="2020-08-05T21:57:23Z" 
Target="Production" 
Version="1.0" 
TransactionIdentifier="PLAN_A" 
SequenceNmbr="123456"
    xmlns="http://www.w3.org/2001/XMLSchema">
    <PlanCode PlanCodeCode="CHOICE">
        <S_DAYS FARE="10" Start="2020-08-07" End="2020-10-30" Mon="true" Tue="true" Weds="true" Thur="true" Fri="true" Sat="true" Sun="true">
            <STUDENT>
                <DIVISION ORIGINAL="150.05" Code="Flat" S_CODE="1" />
                <DIVISION ORIGINAL="150.05" Code="Flat" S_CODE="2" />
            </STUDENT>
        </S_DAYS>
    </PlanCode>
</SSO_XML>') 
 from dual
 )

select h.PlanCodeCode
,b.Original
,b.code
,b.s_code
 from   t
    cross join
    xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
             '/SSO_XML'
             passing t.xml
             columns PlanCodeCode varchar2(100)  path './PlanCode/@PlanCodeCode',
                     attributes xmltype path './PlanCode'
            ) h
    cross join xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
             'PlanCode/S_DAYS/STUDENT/DIVISION'
             passing h.attributes
             columns 
                    ORIGINAL number path  '@ORIGINAL',
                    Code            varchar2(100) path '@Code',
                    S_CODE  number path '@S_CODE'
            ) b;

输出:

我正在尝试在查询或新查询中获取以下值: 有没有办法做到这一点?任何帮助/方向表示赞赏。

【问题讨论】:

    标签: sql xml oracle plsql xmltype


    【解决方案1】:

    您只需要以这种方式完成您的第一个 XMLTABLE 查询 (h):

    target  varchar2(100) path '/SSO_XML/@Target',
    transactionId  varchar2(100) path '/SSO_XML/@TransactionIdentifier'
    

    【讨论】:

      【解决方案2】:

      您正在尝试包含两个属性,它们使用 @ 前缀访问;因此您的查询可以修改为:

      select h.PlanCodeCode
      ,h.target
      ,h.transactionIdentifier
      ,b.Original
      ,b.code
      ,b.s_code
       from   t
          cross join
          xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
                   '/SSO_XML'
                   passing t.xml
                   columns PlanCodeCode varchar2(100)  path './PlanCode/@PlanCodeCode',
                           target varchar2(100) path '@Target',
                           transactionIdentifier varchar2(100) path '@TransactionIdentifier',
                           attributes xmltype path './PlanCode'
                  ) h
      ...
      

      db<>fiddle

      在这种情况下,您也可以在单个 XMLTable 调用中执行此操作,该调用更短,但可能更难阅读和维护:

      select b.PlanCodeCode
      ,b.target
      ,b.transactionIdentifier
      ,b.Original
      ,b.code
      ,b.s_code
       from   t
          cross join
          xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
                   '/SSO_XML/PlanCode/S_DAYS/STUDENT/DIVISION'
                   passing t.xml
                   columns PlanCodeCode varchar2(100)  path './../../../@PlanCodeCode',
                           target varchar2(100) path './../../../../@Target',
                           transactionIdentifier varchar2(100) path './../../../../@TransactionIdentifier',
                           ORIGINAL number path  '@ORIGINAL',
                           Code varchar2(100) path '@Code',
                           S_CODE  number path '@S_CODE'
                  ) b;
      

      db<>fiddle

      【讨论】:

      • 是的.. 我花了几个小时在谷歌上搜索不必要的关键字。 :) 我的想法没有经过这个.. 谢谢亚历克斯。支持您的意见并接受Thomas 的意见..您的意见都有帮助..他是第一个。
      猜你喜欢
      • 2013-07-06
      • 2019-08-19
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      相关资源
      最近更新 更多