从Oracle中的XML列中提取值

时间:2019-06-11 16:18:10

标签: sql xml oracle xmltable

我在Oracle表中有一些数据,这些数据存储在XML格式的字符串中(表response中的列WS_LOG)。

我想从<MedicalProcedureOutput>下的每个不同节点中提取数据,但是在访问每个节点时遇到了一些困难。你能发现我在做什么错吗?

这就是我要尝试的方法(此处尝试检索icpcID标签的值):

 SELECT a.id,
  t1.icpcID FROM
  GH.WS_LOG a, 
  xmltable(
  xmlnamespaces(
'http://schemas.xmlsoap.org/soap/envelope/' as "soap",
'http://www.w3.org/2001/XMLSchema' as "xsd",
'http://www.w3.org/2001/XMLSchema-instance' as "xsi"),
'/soap:Envelope/soap:Body/createBillingSubmissionForAFEBSGResponse/createBillingSubmissionForAFEBSGResult/proceduresList/MedicalProcedureOutput' passing xmltype(a.response) columns
icpcID varchar2(50) path 'ipcdId') t1

这是一些示例数据

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <createBillingSubmissionForAFEBSGResponse xmlns="urn:bcpcorp.net/ws/bsgFacets/FacetsBillingService">
         <createBillingSubmissionForAFEBSGResult>
            <status>0</status>
            <outputMessage />
            <statusElement />
            <claimID>18E002021300</claimID>
            <claimStatus>01</claimStatus>
            <claimStatusReason>AGFP</claimStatusReason>
            <totalChargeValue>35.0000</totalChargeValue>
            <totalPayableValue>0.0000</totalPayableValue>
            <paitentPaidvalue>17.5</paitentPaidvalue>
            <totalDebitAmount>0</totalDebitAmount>
            <proceduresList>
               <MedicalProcedureOutput>
                  <ipcdId>011801</ipcdId>
                  <otherdisallowedAmountResponsibility>N</otherdisallowedAmountResponsibility>
               </MedicalProcedureOutput>
            </proceduresList>
         </createBillingSubmissionForAFEBSGResult>
      </createBillingSubmissionForAFEBSGResponse>
   </soap:Body>
</soap:Envelope>

我希望得到的值是'011801'。请注意,可能会出现多个<MedicalProcedureOutput>节点,它们的组织方式如下:


               <MedicalProcedureOutput>
                  <ipcdId>725013</ipcdId>     
          <otherdisallowedAmountResponsibility>N</otherdisallowedAmountResponsibility>
               </MedicalProcedureOutput>

               <MedicalProcedureOutput>
                  <ipcdId>725105</ipcdId>   
            <otherdisallowedAmountResponsibility>N</otherdisallowedAmountResponsibility>
               </MedicalProcedureOutput>

2 个答案:

答案 0 :(得分:2)

您需要为主体中的所有内容声明一个默认名称空间,因为createBillingSubmissionForAFEBSGResponse有自己的xmlns未命名(因此为默认)声明,该声明从该节点开始使用;所以:

SELECT a.id,
  t1.icpcID FROM
  GH.WS_LOG a,
  xmltable(
  xmlnamespaces(
default 'urn:bcpcorp.net/ws/bsgFacets/FacetsBillingService',
'http://schemas.xmlsoap.org/soap/envelope/' as "soap",
'http://www.w3.org/2001/XMLSchema' as "xsd",
'http://www.w3.org/2001/XMLSchema-instance' as "xsi"
),
'/soap:Envelope/soap:Body/createBillingSubmissionForAFEBSGResponse/createBillingSubmissionForAFEBSGResult/proceduresList/MedicalProcedureOutput' passing xmltype(a.response) columns
icpcID varchar2(50) path 'ipcdId') t1
/

        ID ICPCID
---------- --------------------------------------------------
         1 011801

或如您稍后显示的那样具有多个节点,他怀疑这将返回:

        ID ICPCID
---------- --------------------------------------------------
         2 725013
         2 725105

db<>fiddle

答案 1 :(得分:0)

您应该使用EXTRACTVALUE函数here You can find来解决此问题。