4

私は Oracle の専門家ではありませんが、必要に応じて、Xml の解析に Oracle パーサーを使用しています。以下にリストされている 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>

私はその方法を使用しました.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 に 2 つの値が次々に存在し、最初に出現した値のみを選択したい場合、つまり以下の 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>

「uganda, AZ12604823-001, IT06686, Hu Mics Metab K, 2006-06-21,2006-07-27」を、「Italy and 2012-02-27」ではなく、その valueArray 内でのみ選択するようにします。しかし、既存のコードを変更する方法がわかりません。

4

1 に答える 1

1

私はこれがあなたが探しているものだと思います-

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シングルトンを提供します。

于 2012-08-17T02:57:17.777 に答える