簡體   English   中英

從Oracle中的XML列中提取值

[英]Extracting values from XML column in Oracle

我在Oracle表中有一些數據,該數據存儲在XML格式的字符串中(表WS_LOGresponse )。

我想從<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>

您需要為主體中的所有內容聲明默認名稱空間,因為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

分貝<>小提琴

您應該使用EXTRACTVALUE函數來解決它, 在這里您可以找到有關它的一些信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM