簡體   English   中英

Oracle 11g中的XML

[英]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>

當“ EndDate”字段“ ValidityPeriod”的日期大於當前日期時,我想獲取“ id”節點的“ Cost Center”字段。

為此,我有以下查詢,但不適用於我。

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字段“ Cost Center”。

問候

無論如何不建議使用 extractValue()函數; 您可以使用XMLTable()從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

您需要XMLTable的列列表中的EndDate ,以便隨后可以使用sysdate對其進行過濾; 我還包括了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'
        )
...

暫無
暫無

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

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