2016-11-15 7 views
2

XMLをループしてUUIDを抽出しようとしています。私は次のようなことがあり、正しい回数だけループして、毎回空白の行を印刷しています。 UUIDノードのテキスト値を抽出しないのはなぜですか?XMLをループしてPLSQLの値を抽出しようとしています

DECLARE 
     X XMLTYPE := XMLTYPE('<?xml version="1.0" ?> 
     <StatusUp> 
      <G_UUIDs> 
       <UUID>1 test 1</UUID> 
       <UUID>2 test 2</UUID> 
       <UUID>3 test 3 </UUID> 
       <UUID>4 test 4 </UUID> 
      </G_UUIDs> 
     </StatusUp>'); 
    BEGIN 
     FOR r IN (SELECT EXTRACTVALUE(VALUE(p), 'StatusUp/G_UUIDs/UUID/text()') AS uuid 

        FROM TABLE(XMLSEQUENCE(EXTRACT(X, '//StatusUp/G_UUIDs/UUID'))) p) 
     LOOP 
      DBMS_OUTPUT.PUT_LINE('UUID' || r.uuid); 
     END LOOP; 
    END; 

答えて

1

あなたはそうのように、SQLステートメントにこれを変換し、それを実行した場合:

COLUMN_VALUE    UUID 
------------------------ ---------- 
<UUID>1 test 1</UUID> 
<UUID>2 test 2</UUID> 
<UUID>3 test 3 </UUID> 
<UUID>4 test 4 </UUID> 

すなわち:

WITH sample_data AS (SELECT XMLTYPE('<?xml version="1.0" ?> 
     <StatusUp> 
      <G_UUIDs> 
       <UUID>1 test 1</UUID> 
       <UUID>2 test 2</UUID> 
       <UUID>3 test 3 </UUID> 
       <UUID>4 test 4 </UUID> 
      </G_UUIDs> 
     </StatusUp>') x FROM dual) 
SELECT p.*, 
     EXTRACTVALUE(VALUE(p), 'StatusUp/G_UUIDs/UUID/text()') AS uuid 
FROM sample_data sd, 
     TABLE(XMLSEQUENCE(EXTRACT(sd.x, '//StatusUp/G_UUIDs/UUID'))) p; 

は、問題を発見するのは簡単だろうノードUUIDだけを含むxmlからノードStatusUp/G_UUIDs/UUIDを抽出しようとしています。代わりに、あなたがのために照会しているノードを修正した場合、あなたは正しい結果を得る:

DECLARE 
    X XMLTYPE := XMLTYPE('<?xml version="1.0" ?> 
    <StatusUp> 
     <G_UUIDs> 
      <UUID>1 test 1</UUID> 
      <UUID>2 test 2</UUID> 
      <UUID>3 test 3 </UUID> 
      <UUID>4 test 4 </UUID> 
     </G_UUIDs> 
    </StatusUp>'); 
BEGIN 
    FOR r IN (SELECT EXTRACTVALUE(VALUE(p), 'UUID/text()') AS uuid 
       FROM TABLE(XMLSEQUENCE(EXTRACT(X, '//StatusUp/G_UUIDs/UUID'))) p) 
    LOOP 
     DBMS_OUTPUT.PUT_LINE('UUID' || r.uuid); 
    END LOOP; 
END; 
/

UUID1 test 1 
UUID2 test 2 
UUID3 test 3 
UUID4 test 4 

をしかし、EXTRACTとEXTRACTVALUEは推奨されません - あなたの代わりにXMLTABLEを使用する必要があります。

DECLARE 
    X XMLTYPE := XMLTYPE('<?xml version="1.0" ?> 
    <StatusUp> 
     <G_UUIDs> 
      <UUID>1 test 1</UUID> 
      <UUID>2 test 2</UUID> 
      <UUID>3 test 3 </UUID> 
      <UUID>4 test 4 </UUID> 
     </G_UUIDs> 
    </StatusUp>'); 
BEGIN 
    FOR r IN (SELECT * 
      FROM XMLTABLE('//StatusUp/G_UUIDs/UUID' 
          PASSING x 
          COLUMNS uuid varchar2(10) PATH '.')) 
    LOOP 
     DBMS_OUTPUT.PUT_LINE('UUID' || r.uuid); 
    END LOOP; 
END; 
/

UUID1 test 1 
UUID2 test 2 
UUID3 test 3 
UUID4 test 4 

をあなたが実行してみてください

同等のクエリ:

WITH sample_data AS (SELECT XMLTYPE('<?xml version="1.0" ?> 
     <StatusUp> 
      <G_UUIDs> 
       <UUID>1 test 1</UUID> 
       <UUID>2 test 2</UUID> 
       <UUID>3 test 3 </UUID> 
       <UUID>4 test 4 </UUID> 
      </G_UUIDs> 
     </StatusUp>') x FROM dual) 
SELECT * 
FROM sample_data sd, 
     XMLTABLE('//StatusUp/G_UUIDs/UUID' 
       PASSING sd.x 
       COLUMNS uuid varchar2(10) PATH '.'); 
+0

感謝ノードが間違っていて、私自身の質問に答えようとしていました。私はXMLTABLEを認識しておらず、それを見ていきます。 – HardLeeWorking

+0

xmltableの提案を実行するとエラーが発生します。行1のエラー ORA-19114:XQuery式の解析中にエラーが発生しました:java.lang.NoClassDefFoundError ORA-06512:12行目 – HardLeeWorking

+0

私があなたに与えたコードは?それは私にとって間違いなく働いたからです。もしそうなら、どのバージョンのOracleを実行していますか? – Boneist

0

あなたは既にFROにXMLからUUIDを抽出しましたM書、および選択で、比喩的に言えば、あなたは今だけ4行

<UUID> n test n </UUID> 

を持っているので、そのデータを抽出するための正しい方法はあること:私はちょうどEXTRACTVALUEの問題を考え出した

DECLARE 
    X XMLTYPE := XMLTYPE(
    '<?xml version="1.0" ?> 
    <StatusUp> 
     <G_UUIDs> 
     <UUID>1 test 1</UUID> 
     <UUID>2 test 2</UUID> 
     <UUID>3 test 3 </UUID> 
     <UUID>4 test 4 </UUID> 
     </G_UUIDs> 
    </StatusUp>'); 
BEGIN 
    FOR r IN (SELECT 
       EXTRACTVALUE(
       VALUE(p), 
       --'StatusUp/G_UUIDs/UUID/text()') AS uuid 
       '/UUID/text()') AS uuid 
      FROM 
       TABLE(
       XMLSEQUENCE(
        EXTRACT(
        X, 
        '//StatusUp/G_UUIDs/UUID') 
       ) 
      ) p 
      ) 
    LOOP 
    DBMS_OUTPUT.PUT_LINE(r.uuid); 
    END LOOP; 
END; 
関連する問題