2016-09-28 31 views
0

おはよう。Xml in oracle 11g

"xmltype"型の変数にxmlがあります。問題の XMLはこれです:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap-env:Header /> 
<soap-env:Body> 
    <n0:EmployeeDataByIdentificationResponse_sync xmlns:n0="http://sap.com/xi/SAPGlobal20/Global" xmlns:prx="urn:sap.com:proxy:GH6:/1SAI/TASBA84FA60747163FD5188:804"> 
     <EmployeeData> 
      <ChangeStateID>     20160923221906.7365850</ChangeStateID> 
      <UUID>00163e06-cc41-1ee3-bb8f-eebd7b8a466e</UUID> 
      <EmployeeID>300056</EmployeeID> 
      <EmploymentData> 
       <UUID>00163e06-cc41-1ed3-bb9a-250ba8cddcd3</UUID> 
       <ChangeStateID>     20140605164803.5438320</ChangeStateID> 
       <EmploymentCountryCode>MX</EmploymentCountryCode> 
       <WorkAgreementData> 
        <UUID>00163e06-cc41-1ed3-bb9a-250ba8ce5cd3</UUID> 
        <ChangeStateID>     20160730162955.5720390</ChangeStateID> 
        <WorkAgreementID>300056/001</WorkAgreementID> 
        <ValidityPeriod> 
         <StartDate>1998-05-18</StartDate> 
         <EndDate>9999-12-31</EndDate> 
        </ValidityPeriod> 
        <AdditionalClauses> 
         <ValidityPeriod> 
          <StartDate>1998-05-18</StartDate> 
          <EndDate>9999-12-31</EndDate> 
         </ValidityPeriod> 
         <AgreedWorkingTimeRate> 
          <DecimalValue>8.0</DecimalValue> 
          <BaseMeasureUnitCode>DAY</BaseMeasureUnitCode> 
         </AgreedWorkingTimeRate> 
         <WorkAgreementTypeCode>1</WorkAgreementTypeCode> 
         <WorkAgreementAdministrativeCategoryCode listID="MX">2</WorkAgreementAdministrativeCategoryCode> 
        </AdditionalClauses> 
        <OrganisationalAssignment> 
         <ValidityPeriod> 
          <StartDate>2013-01-01</StartDate> 
          <EndDate>9999-12-31</EndDate> 
         </ValidityPeriod> 
         <PositionAssignment> 
          <ValidityPeriod> 
           <StartDate>2013-01-01</StartDate> 
           <EndDate>9999-12-31</EndDate> 
          </ValidityPeriod> 
          <PositionUUID>00163e06-cc41-1ed3-bb9a-24e569a75cd3</PositionUUID> 
          <PositionID>POS30005620140605164</PositionID> 
          <AssignmentPercent>100.0</AssignmentPercent> 
          <OrganisationalCenterDetails> 
           <ValidityPeriod> 
            <StartDate>2013-01-01</StartDate> 
            <EndDate>9999-12-31</EndDate> 
           </ValidityPeriod> 
           <OrganisationalCenterUUID>00163e06-cc41-1ed3-bb82-fea27ecddec6</OrganisationalCenterUUID> 
           <OrganisationalCenterID>LFSA11514</OrganisationalCenterID> 
          </OrganisationalCenterDetails> 
          <JobAssignmentDetails> 
           <ValidityPeriod> 
            <StartDate>2013-01-01</StartDate> 
            <EndDate>9999-12-31</EndDate> 
           </ValidityPeriod> 
           <JobUUID>00163e06-cc41-1ee3-bb88-68132a6b7aa2</JobUUID> 
           <JobID>PR006</JobID> 
          </JobAssignmentDetails> 
         </PositionAssignment> 
         <ReportingLineUnit> 
          <Id>LFSA11000</Id> 
          <Name>Laboratorios Finlay San Pedro Sula</Name> 
          <ValidityPeriod> 
           <StartDate>2013-01-01</StartDate> 
           <EndDate>2013-12-31</EndDate> 
          </ValidityPeriod> 
         </ReportingLineUnit> 
         <ReportingLineUnit> 
          <Id>LFSA11510</Id> 
          <Name>Produccion</Name> 
          <ValidityPeriod> 
           <StartDate>2014-01-01</StartDate> 
           <EndDate>2014-12-14</EndDate> 
          </ValidityPeriod> 
         </ReportingLineUnit> 
         <ReportingLineUnit> 
          <Id>LFSA11510</Id> 
          <Name>Produccion</Name> 
          <ValidityPeriod> 
           <StartDate>2014-12-15</StartDate> 
           <EndDate>9999-12-31</EndDate> 
          </ValidityPeriod> 
         </ReportingLineUnit> 
         <CostCenter> 
          <Id>LFSA11514</Id> 
          <Name>Liquidos Jarabes</Name> 
          <ValidityPeriod> 
           <StartDate>2013-01-01</StartDate> 
           <EndDate>2013-12-31</EndDate> 
          </ValidityPeriod> 
         </CostCenter> 
         <CostCenter> 
          <Id>LFSA11514</Id> 
          <Name>Liquidos Jarabes</Name> 
          <ValidityPeriod> 
           <StartDate>2014-01-01</StartDate> 
           <EndDate>2014-12-14</EndDate> 
          </ValidityPeriod> 
         </CostCenter> 
         <CostCenter> 
          <Id>LFSA11514</Id> 
          <Name>Liquidos Jarabes</Name> 
          <ValidityPeriod> 
           <StartDate>2014-12-15</StartDate> 
           <EndDate>9999-12-31</EndDate> 
          </ValidityPeriod> 
         </CostCenter> 
        </OrganisationalAssignment> 
       </WorkAgreementData> 
      </EmploymentData> 
      <BiographicalData> 
       <ValidityPeriod> 
        <StartDate>0001-01-01</StartDate> 
        <EndDate>9999-12-31</EndDate> 
       </ValidityPeriod> 
       <FormOfAddressCode>0001</FormOfAddressCode> 
       <AcademicTitleCode>Z011</AcademicTitleCode> 
       <GivenName>Maria</GivenName> 
       <FamilyName>Reyes</FamilyName> 
       <AdditionalFamilyName>Membreno</AdditionalFamilyName> 
       <MiddleName>Elena</MiddleName> 
       <GenderCode>2</GenderCode> 
       <BirthName>ronal</BirthName> 
       <BirthDate>1967-11-20</BirthDate> 
       <MaritalStatusCode>1</MaritalStatusCode> 
       <NationalityCountryCode>HN</NationalityCountryCode> 
      </BiographicalData> 
      <AddressInformation> 
       <UUID>00163e06-cc41-1ee3-bb8f-eebd7b8aa66e</UUID> 
       <ValidityPeriod> 
        <StartDate>0001-01-01</StartDate> 
        <EndDate>9999-12-31</EndDate> 
       </ValidityPeriod> 
       <Address> 
        <PostalAddress> 
         <CountryCode>HN</CountryCode> 
         <StreetPostalCode>21101</StreetPostalCode> 
         <StreetName>Baracoa</StreetName> 
         <TimeZoneCode>UTC-6</TimeZoneCode> 
        </PostalAddress> 
        <Telephone> 
         <TelephoneFormattedNumberDescription>55555</TelephoneFormattedNumberDescription> 
         <NormalisedNumberDescription>55555</NormalisedNumberDescription> 
         <MobilePhoneNumberIndicator>true</MobilePhoneNumberIndicator> 
         <SMSEnabledIndicator>true</SMSEnabledIndicator> 
        </Telephone> 
       </Address> 
      </AddressInformation> 
      <WorkplaceAddressInformation> 
       <UUID>00163e06-cc41-1ee3-bb8f-eebd7b8ce66e</UUID> 
       <WorkplaceAddressOrganisation> 
        <TypeCode>1</TypeCode> 
        <PostalAddress> 
         <CountryCode>HN</CountryCode> 
         <StreetPostalCode>21101</StreetPostalCode> 
         <StreetName>Baracoa</StreetName> 
         <TimeZoneCode>UTC-6</TimeZoneCode> 
        </PostalAddress> 
       </WorkplaceAddressOrganisation> 
      </WorkplaceAddressInformation> 
     </EmployeeData> 
     <ProcessingConditions> 
      <ReturnedQueryHitsNumberValue>1</ReturnedQueryHitsNumberValue> 
      <MoreHitsAvailableIndicator>false</MoreHitsAvailableIndicator> 
      <LastReturnedObjectID>00163E06CC411EE3BB8FEEBD7B8A466E</LastReturnedObjectID> 
     </ProcessingConditions> 
    </n0:EmployeeDataByIdentificationResponse_sync> 
</soap-env:Body> 

と「終了日」フィールド「ValidityPeriod」の日付が現在よりも大きいとき、私は「ID」ノード「コストセンター」フィールドを取得したいです日付。

私は次のクエリを持っていますが、私のために働いていません。

FOR r IN (
       SELECT ExtractValue(Value(p),'/OrganisationalAssignment/CostCenter/Id/text()') as CODIGO_CECO, 
         ExtractValue(Value(p),'/OrganisationalAssignment/CostCenter/Name/text()') as DESCRIPCION_CECO   
        FROM TABLE(XMLSequence(Extract(xrespond,'/WorkAgreementData/OrganisationalAssignment'))) p 
       WHERE TO_DATE(ExtractValue(Value(p),'/OrganisationalAssignment/ValidityPeriod/EndDate/text()'),'RRRR-MM-DD') >= TRUNC(SYSDATE) 
     ) LOOP  
      CECOID := r.CODIGO_CECO; 
      CECODESCRIPCION := r.DESCRIPCION_CECO; 
      END LOOP; 

ノードが返す行が多すぎるというエラーが発生します。

日付「validityPeriod」が現在の日付より大きい場合、IDフィールド「コストセンター」を取得するにはどうすればよいですか。

よろしく

答えて

0

extractValue()機能is deprecated anywayXMLTable()を使用して、XMLから複数の結果を取得することができます。あなたが投稿した値で

、この:

FOR r IN (
     SELECT * 
     FROM XMLTable('//WorkAgreementData/OrganisationalAssignment/CostCenter' 
     PASSING xrespond 
     COLUMNS CODIGO_CECO VARCHAR(10) PATH 'Id', 
      DESCRIPCION_CECO VARCHAR(50) PATH 'Name', 
      START_DATE DATE PATH 'ValidityPeriod/StartDate', 
      END_DATE DATE PATH 'ValidityPeriod/EndDate' 
     ) 
     WHERE END_DATE >= TRUNC(SYSDATE) 
    ) LOOP  
     CECOID := r.CODIGO_CECO; 
     CECODESCRIPCION := r.DESCRIPCION_CECO; 

     dbms_output.put_line(CECOID ||' : '|| CECODESCRIPCION 
      ||' : '|| r.START_DATE ||' : '|| r.END_DATE); 
     END LOOP; 

を生成します。

PL/SQL procedure successfully completed. 

LFSA11514 : Liquidos Jarabes : 15-DEC-14 : 31-DEC-99 

あなたがsysdateを使用することをフィルタリングすることができますので、あなたがのXMLTableの列リストにEndDateを必要とします。私はStartDateも含めて、あなたが本当にできることを示しています。追加のデータが必要な場合は、他の列も追加できます。

またxs:date()fn:current-date()を使用して、XPathの中でフィルタリングを行うことができます:

FOR r IN (
     SELECT * 
     FROM XMLTable('for $i in //WorkAgreementData/OrganisationalAssignment/CostCenter 
      where xs:date($i/ValidityPeriod/EndDate) ge fn:current-date() 
      return $i' 
     PASSING xrespond 
     COLUMNS CODIGO_CECO VARCHAR(10) PATH 'Id', 
      DESCRIPCION_CECO VARCHAR(50) PATH 'Name' 
     ) 
... 
+0

こんにちは@Alexプール。助けてくれてありがとう –