sql >> データベース >  >> RDS >> Oracle

CLOB内のXMLから、パスのリストを含むOracleテーブルへ

    UPD かなり大きなxmlファイル(140 KB)が見つかりました。私のシステム:コアi5プロセッサ(2400 MHz)、仮想マシン内のoracle 12c、処理時間-0.38秒を備えたノートブック。この方法は、私が知っている唯一の代替手段です。ここで私がw3schools.comで見つけたxmlの例。

    declare
      xml_str clob := q'[<?xml version="1.0" encoding="UTF-8"?>
    <CATALOG>
     <CD>
      <TITLE>Empire Burlesque</TITLE>
      <ARTIST>Bob Dylan</ARTIST>
      <COUNTRY>USA</COUNTRY>
      <COMPANY>Columbia</COMPANY>
      <PRICE>10.90</PRICE>
      <YEAR>1985</YEAR>
     </CD>
     <CD>
      <TITLE>Hide your heart</TITLE>
      <ARTIST>Bonnie Tyler</ARTIST>
      <COUNTRY>UK</COUNTRY>
      <COMPANY>CBS Records</COMPANY>
      <PRICE>9.90</PRICE>
      <YEAR>1988</YEAR>
     </CD>
    </CATALOG>]';
    
    v_doc  dbms_xmldom.domdocument;
    node   dbms_xmldom.domnode;
    txt    varchar2(4000);
    type   t_list is table of number index by varchar2(4000);
    v_list t_list;
      procedure enum_nodes(n dbms_xmldom.domnode, tag_name varchar2) is
        chn  dbms_xmldom.domnode;
        nl   dbms_xmldom.domnodelist;
      begin
        nl := dbms_xmldom.getchildnodes(n);
        for i in 0..dbms_xmldom.getlength(nl) loop
          chn := dbms_xmldom.item(nl, i);
    
          if dbms_xmldom.getnodetype(chn) = 1 then
             enum_nodes(chn, tag_name || dbms_xmldom.getnodeName(chn) || '/');
          elsif dbms_xmldom.getnodetype(chn) = 3 then
             v_list(tag_name || dbms_xmldom.getnodevalue(chn)) := 1;
          end if;
        end loop;
      end;
    begin
      v_doc := dbms_xmldom.newdomdocument(xml_str);
      node := dbms_xmldom.makenode(v_doc);
    
      enum_nodes(node, '/');
    
      txt := v_list.first;
      while txt is not null loop
         dbms_output.put_line(txt);
         txt := v_list.next(txt);
      end loop;
    end;
    /
    



    1. PHP環境の別のクエリで1つのMySQLクエリの結果を使用する

    2. ローカル データベースをリンク サーバーとして使用すると、遅延準備が完了できませんでしたというエラーが表示される

    3. MysqlにUNIXミリ秒で日付を保存する方法は?

    4. Mysqlは同じクエリで行データを使用して別の行を選択しますか?