2012-08-16 2 views
4

Oracle의 전문가는 아니지만 요구 사항에 따라 Oracle Parser for Xars를 사용하고 있습니다. 아래에 나열된 XML 내용 즉오라클 파서를 사용하여 XML에서 첫 번째 발생 값

<?xml version="1.0" encoding="iso-8859-1" ?> 
<SearchOutput> 
<rowArray> 
    <Row> 
     <cellArray> 
      <Cell> 
       <columnId>1</columnId> 
       <valueArray> 
        <Value> 
         <value>IR000024575453</value> 
        </Value> 
       </valueArray> 
      </Cell> 
      <Cell> 
       <columnId>5</columnId> 
       <valueArray> 
        <Value> 
         <value>AZ12604823-001</value> 
        </Value> 
       </valueArray> 
      </Cell> 
      <Cell> 
       <columnId>2</columnId> 
       <valueArray> 
        <Value> 
         <value>IT06686</value> 
        </Value> 
       </valueArray> 
      </Cell> 
      <Cell> 
       <columnId>9</columnId> 
       <valueArray> 
        <Value> 
         <value>Hu Mics Metab K</value> 
        </Value> 
       </valueArray> 
      </Cell> 
      <Cell> 
       <columnId>8</columnId> 
       <valueArray> 
        <Value> 
         <value>2006-06-21</value> 
        </Value> 
       </valueArray> 
      </Cell> 
      <Cell> 
       <columnId>7</columnId> 
       <valueArray> 
        <Value> 
         <value>2006-07-27</value> 
        </Value> 
       </valueArray> 
      </Cell> 
     </cellArray> 
    </Row> 
</rowArray> 
</SearchOutput> 

I는 l_xmlclob가 CLOB 데이터 유형을 가지며, 상기 XML을 할당하는 방법을 사용 하였다.

FOR r IN ( SELECT rownum rn, cells 
      FROM xmltable('/SearchOutput/rowArray/Row' passing XMLTYPE(l_xmlclob) 
            columns CELLS XMLTYPE PATH './cellArray') 
     ) 
LOOP 
    DBMS_OUTPUT.PUT_LINE('Row: '||r.rn);  

    FOR c IN (SELECT colid, colval 
       FROM xmltable('/cellArray/Cell' passing r.cells 
               columns COLID NUMBER PATH './columnId', 
                 COLVAL VARCHAR(20) PATH  './valueArray/Value/value') 
      ) 
    LOOP 
    DBMS_OUTPUT.PUT_LINE('colid, col value: '||c.colid||', '||c.colval); 
    END LOOP; 
END LOOP; 

및 작업 미세하고 그 출력

Row: 1 
colid, col value: 1, IR000024575453 
colid, col value: 5, AZ12604823-001 
colid, col value: 2, IT06686 
colid, col value: 9, Hu Mics Metab K 
colid, col value: 8, 2006-06-21 
colid, col value: 7, 2006-07-27 

비슷하지만 두 값이 XML에서 잇달아이 있으면 문제가 발생하고 난 단지 예를위한 첫 번째 발생을 선택하고자 아래의 XML 내가 원하는

<?xml version="1.0" encoding="iso-8859-1" ?> 
<SearchOutput> 
<rowArray> 
<Row> 
    <cellArray> 
     <Cell> 
      <columnId>1</columnId> 
      <valueArray> 
       <Value> 
        <value>Uganda</value> 
       </Value> 
       <Value> 
        <value>Italy</value> 
       </Value> 
      </valueArray> 
     </Cell> 
     <Cell> 
      <columnId>5</columnId> 
      <valueArray> 
       <Value> 
        <value>AZ12604823-001</value> 
       </Value> 
      </valueArray> 
     </Cell> 
     <Cell> 
      <columnId>2</columnId> 
      <valueArray> 
       <Value> 
        <value>IT06686</value> 
       </Value> 
      </valueArray> 
     </Cell> 
     <Cell> 
      <columnId>9</columnId> 
      <valueArray> 
       <Value> 
        <value>Hu Mics Metab K</value> 
       </Value> 
      </valueArray> 
     </Cell> 
     <Cell> 
      <columnId>8</columnId> 
      <valueArray> 
       <Value> 
        <value>2006-06-21</value> 
       </Value> 
      </valueArray> 
     </Cell> 
     <Cell> 
      <columnId>7</columnId> 
      <valueArray> 
       <Value> 
        <value>2006-07-27</value> 
       </Value> 
       <Value> 
        <value>2012-02-27</value> 
       </Value> 
      </valueArray> 
     </Cell> 
    </cellArray> 
</Row> 
</rowArray> 
</SearchOutput> 

은 "우간다는 AZ12604823-001는 IT06686, 후 마이크 Metab K, 2006-06-21,2006-07-27는"뿐만 아니라 "이탈리아 2012 그 valueArray 내에서 선택한다 -02-27 ". 그러나 기존 코드를 수정하는 방법을 모르십시오.

+1

원래의 질문에서 나는 "Array"가 나쁜 것을 의미한다는 것을 알고있었습니다 :)이 XML 소스를 가지고있는 것이 도움이되었을 것입니다. 왜냐하면 실제로 수정을 위해 필요한 모든 것이 어딘가에 있기 때문입니다! – Tom

+0

@Tom Once Again 다시 한번 감사드립니다. – IConfused

답변

1

나는 이것이 당신이 찾고있는 것을 추측 for-

FOR r IN ( SELECT rownum rn, cells 
      FROM xmltable('/SearchOutput/rowArray/Row' passing XMLTYPE(l_xmlclob) 
            columns CELLS XMLTYPE PATH './cellArray') f 
     ) 
LOOP 
    DBMS_OUTPUT.PUT_LINE('Row: '||r.rn);  
    FOR c IN (SELECT colid, 
        colval 
       FROM xmltable('for $i in /cellArray/Cell 
           return $i' 
           passing r.cells 
           columns COLID NUMBER PATH 'columnId', 
             COLVAL VARCHAR(20) PATH 'valueArray/Value[1]/value')     
      ) 
    LOOP 
    DBMS_OUTPUT.PUT_LINE('colid, col value: '||c.colid||', '||c.colval); 
    END LOOP; 
END LOOP; 
end; 

또는

FOR r IN ( SELECT rownum rn, cells 
      FROM xmltable('/SearchOutput/rowArray/Row' passing XMLTYPE(l_xmlclob) 
            columns CELLS XMLTYPE PATH './cellArray') 
     ) 
LOOP 
    DBMS_OUTPUT.PUT_LINE('Row: '||r.rn);  

    FOR c IN (SELECT colid, colval 
       FROM xmltable('/cellArray/Cell' passing r.cells 
               columns COLID NUMBER PATH './columnId', 
                 COLVAL VARCHAR(20) PATH  './valueArray/Value[1]/value') 
      ) 
    LOOP 
    DBMS_OUTPUT.PUT_LINE('colid, col value: '||c.colid||', '||c.colval); 
    END LOOP; 
END LOOP; 

출력 -

Row: 1 
colid, col value: 1, Uganda 
colid, col value: 5, AZ12604823-001 
colid, col value: 2, IT06686 
colid, col value: 9, Hu Mics Metab K 
colid, col value: 8, 2006-06-21 
colid, col value: 7, 2006-07-27 

Value[1] 당신에게 여러 줄 요소의 첫 번째 줄 것이다 즉 처음으로 Value 싱글 톤입니다.

+0

감사합니다. 관련 파싱 자습서를 어디에서 찾을 수 있는지 알려주세요. – IConfused

+0

@IConfused에는 웹에서 사용할 수있는 많은 자습서가 있습니다. 그러나 내가 제공 한 솔루션은 XML XPath 관련 지식이 더 많아서 XML XPath 설명서를 좀 더 살펴볼 수 있습니다. XML DB 기능에 대한 [흥미로운 문서] (http://www.oracle.com/technetwork/database/features/xmldb/xmlqueryoptimize11gr2-168036.pdf). – Annjawn

+0

다시 한 번 감사드립니다. – IConfused