Извлечение значений из столбца XML в Oracle - PullRequest
1 голос
/ 11 июня 2019

У меня есть некоторые данные в таблице 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

И вот несколько примеровdata

<?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 ]

2 голосов
/ 11 июня 2019

Вам необходимо объявить пространство имен по умолчанию для всего, что находится внутри тела, поскольку 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

0 голосов
/ 11 июня 2019

Вам нужно разобраться, чтобы решить ее с помощью функции EXTRACTVALUE, здесь. Вы можете найти некоторую информацию об этом.

...