2013-05-27 3 views
2

희망이 매우 간단하지만 뭔가 누락되었습니다.다중 항목 xmltable 11g를 사용하여 xml 노드 값 검색

<?xml version = '1.0' encoding = 'UTF-8'?><PFA> 
     <Person id="11" action="add" date="20-Nov-2012"> 
      <Gender>Male</Gender> 
      <ActiveStatus>Active</ActiveStatus> 
      <Deceased>Yes</Deceased> 
      <RoleDetail> 
      <Roles RoleType="Primary Occupation"> 
       <OccTitle OccCat="16">Deceased</OccTitle> 
      </Roles> 
      <Roles RoleType="Previous Roles"> 
       <OccTitle SinceMonth="Nov" SinceYear="2010" ToMonth="Jan" ToYear="2011" OccCat="16">Candidate</OccTitle> 
       <OccTitle SinceMonth="Mar" SinceYear="2005" ToYear="2005" OccCat="16">Candidate,23</OccTitle> 
       <OccTitle OccCat="16">President</OccTitle> 
       <OccTitle SinceDay="22" SinceMonth="Oct" SinceYear="1993" ToDay="15" ToMonth="Mar" ToYear="2003" OccCat="1">President </OccTitle> 
       <OccTitle OccCat="7">Supreme Commander</OccTitle> 
       <OccTitle SinceDay="08" SinceMonth="Dec" SinceYear="1976" ToDay="14" ToMonth="Jul" ToYear="1978" OccCat="1">Prime Minister </OccTitle> 
      </Roles> 
      </RoleDetail> 
     </Person> 
     </PFA> 

가 내 테이블에 값을 저장하려면이 XML 쿼리 오전 :

내 XML이다.

내 쿼리 -

SELECT t.personid, t.occtitle,r.roleid,t.sinceday,t.sincemonth,t.sinceyear,t.today,t.tomonth,t.toyear,t.occcat 
FROM xml_files p,master_roletypelists r, 
    XMLTable(
     'for $i in PFA/Person/RoleDetail/Roles/OccTitle 
     return <row> 
     { 
      $i/../../../@id, 
      $i/../@RoleType, 
      $i/@SinceDay, 
      $i/@SinceMonth, 
      $i/@SinceYear, 
      $i/@ToDay, 
      $i/@ToMonth, 
      $i/@ToYear, 
      $i/@OccCat 
     } 
     </row>' 
     PASSING p.filecontent 
     COLUMNS 
       personid number PATH '@id', 
       occtitle VARCHAR2(4000) PATH '.', 
       RoleType VARCHAR2(2000) PATH '@RoleType', 
       sinceday VARCHAR2(2000) PATH '@SinceDay', 
       sincemonth VARCHAR2(2000) PATH '@SinceMonth', 
       sinceyear VARCHAR2(2000) PATH '@SinceYear', 
       today VARCHAR2(2000) PATH '@ToDay', 
       tomonth VARCHAR2(2000) PATH '@ToMonth', 
       toyear VARCHAR2(2000) PATH '@ToYear', 
       occcat VARCHAR2(2000) PATH '@OccCat' 

    ) t where t.roletype = r.rolename 
; 

그러나

이를 위해 내가 널 (null)로 열 'OCCTITLE'을 얻고있다.

OccTitle 노드 값을 가져 오는 쿼리를 수정하는 데 도움을주십시오. 예를 들어 첫 번째 행의 OccTitle 열에서 null 대신 "Deceased"값을 가져 오기로되어 있습니다.

이것이 방법이 아닌 경우 해결 방법을 알려주십시오. 도움이 될 것입니다.

답변

4

<OccTitle/> 요소를 절대로 포함하지 않았습니다. 예를 들어, 다음과 같이 사용하십시오.

for $i in PFA/Person/RoleDetail/Roles/OccTitle 
    return <row> 
    { 
     $i/../../../@id, 
     $i/../@RoleType, 
     $i/@SinceDay, 
     $i/@SinceMonth, 
     $i/@SinceYear, 
     $i/@ToDay, 
     $i/@ToMonth, 
     $i/@ToYear, 
     $i/@OccCat, 
     $i (: was missing :) 
    } 
    </row> 

전체 요소가 포함됩니다. 데이터에만 관심이있는 경우 해당 행을 data($i)으로 바꿉니다.

+0

답장을 보내 주셔서 감사합니다. 그것은 내가 언급 한대로 그것을 사용할 때 완벽하게 작동했습니다. 하지만 PFA/Person/RoleDetail/Roles/OccTitle에서 $ i를 사용하려고 시도했을 때 {$ i /../../../@ id, $ i (: 포함), $ i /../ @RoleType, $ i/@ SinceDay, $ i/@ SinceMonth, $ i/@ SinceYear, $ i/@ ToDay, $ i/@ ToMonth, $ i/@ ToCear}. 이것은 "xquery 표현식을 파싱하는 중 오류"와 같은 오류를 표시합니다. 나는 초심자이고 전문가가 아니기 때문에 왜 그런 경우에 오류가 발생했는지 알려 주시기 바랍니다. – Kiran

+1

속성을 사용하여 요소를 구성하는 경우 모든 특성은 특성이없는 첫 번째 내용보다 먼저 _ 발생해야합니다. '$ i'를 순서의 마지막 위치로 이동하십시오 (닫는'''직전). 당신의 주석에서, 닫을 때 대쉬가 빠져 있습니다 (':)). –

+0

@ Jens.. 자세한 설명을 주셔서 감사 드리며 귀하의 도움에 진심으로 감사드립니다. – Kiran