ストレージ・プロシージャを使用してXML形式でXMLファイルにデータをエクスポート


最近、XMLファイルにデータをエクスポートする方法をネット上で多くの人が聞いているのを見て、多くの解決方法はdbms_です.xmlgen+utl_file、まず、この方法は確かにいいですが、いくつかの欠点があります.システムでXMLファイルをエクスポートする必要がある場合、通常はデータ量が大きいため、ビッグデータ量のエクスポートに対してUTL_FILEは青白く見えます.しかもDBMS_XML GEN取得データ自体にフォーマットがあるのでUTL_FILEのINSTRは少し余計に見えます.しかし、私はこの方法を記録しなければなりません.また、DBMS_を使うこともあります.XSLPROSCESSORパッケージの方法.
一、準備
データの準備:
      CREATE TABLE xml_table(ID VARCHAR2(20),
                                             OBJECT_VALUE VARCHAR2(200));
データのインポート:
       BEGIN
       FOR i IN 1 .. 100000 LOOP
            INSERT INTO xml_table VALUES (i,'blog.csdn.net/zhangchu_63');
       END LOOP;
       COMMIT;
       END;
      /
上記の操作によりxmlという名前のtableのテーブルには、100000個のデータが挿入されています.XMLファイルはOSにエクスポートされることを知っています.そのため、ORACLEでファイルのパスを作成する必要があります.
      CREATE OR REPLACE DIRECTORY D_OUTPUT AS 'D:\TEMP';
次は私たちが始めます.
二、仕事を始める
      1、dbms_xmlgen+utl_fileモード
     create or replace procedure xml_output is/**このストレージ・プロシージャはdbms_を使用します.xmlgen+utl_ファイルの2つのパッケージは、XML*/へのデータのエクスポートを完了します.
       xml_ctx dbms_xmlgen.ctxType;        v_file utl_file.file_type;        xml_txt varchar2(4000);        line varchar2(500);        begin
        xml_ctx := dbms_xmlgen.newContext('select * from xml_table order by id');        dbms_xmlgen.setRowSetTag(xml_ctx,'DBMS');        dbms_xmlgen.setRowTag(xml_ctx,'XML_TABLE');        xml_txt := dbms_xmlgen.getXML(xml_ctx);
       v_file := utl_file.fopen('XML_OUTPUT','test.xml','w');        loop            line := substr(xml_txt,1,instr(xml_txt,chr(10))-1);          utl_file.put_line(v_file,line);          exit when instr(line,'')>0;          xml_txt := substr(xml_txt,instr(xml_txt,chr(10))+1);        end loop;  
       dbms_xmlgen.closeContext(xml_ctx);        utl_file.fclose(v_file);     end xml_output ;
dbms_を使用していますxmlgen+utl_file方式でXMLをエクスポートするのですが、私のストレージプロセスにはパラメータがありません.必要なら自分で追加してもいいです.
  
     2、dbms_xmlgen+DBMS_XSLPROSCESSOR方式
     create or replace procedure xml_print is/**このストレージ・プロシージャはdbms_を使用します.xmlgen+DBMS_XSLPROSCESSOR 2つのパッケージ
を選択して、XML*/へのデータのエクスポートを完了します.
       xml_ctx dbms_xmlgen.ctxType;        xml_txt clob;      begin
       xml_ctx := dbms_xmlgen.newContext('select * from xml_table
                         order by id');
      dbms_xmlgen.setRowSetTag(xml_ctx,'DBMS');       dbms_xmlgen.setRowTag(xml_ctx,'XML_TABLE');       xml_txt := to_clob(dbms_xmlgen.getXML(xml_ctx));       DBMS_XSLPROCESSOR.clob2file
                                  (xml_txt,'XML_OUTPUT','test.xml');
      dbms_xmlgen.closeContext(xml_ctx);
     
     end xml_print;
xml_にかかわらずtxtのフォーマットは、testにすべてのデータを直接書き込む.xmlで.
三、方法の比較
     dbms_xmlgen+utl_file方式:100000件のデータをエクスポートして、2分で導き出していないで、私は耐えられません
心が待ちました.
     dbms_xmlgen+DBMS_XSLPROSCESSOR方式:100000個のデータをエクスポートするのに使いました
10秒です.
四、まとめ
私が書いた過程と比較を見て、私は言うまでもなく、みんなもどのように選ぶか知っているでしょう.ここで私はやはり、最も良い方法がなくて、最も適当な方法だけあって、具体的な問題によって具体的に対処します.
注:私の上の過程は簡便のためで、だから注釈がなくて、EXCEPTIONがなくて、みんなが私を学ばないでくださいを望んで、良い書く習慣を身につけます.
皆さんが勉強しやすいようにdbms_xslprocessorで使用するプロセスの説明を貼り付けて、参考にしてください.
 

CLOB2FILE Procedure


This procedure writes content of a CLOB into a file.
Syntax
DBMS_XSLPROCESSOR.CLOB2FILE(
  cl          IN  CLOB;
  flocation   IN  VARCHAR2,
  fname       IN  VARCHAR2,
  csid        IN  NUMBER:=0);

 
Parameter Description CLOB
File directory flocation
File directory fname
File name csid
Character set id of the file
  • Must be a valid Oracle id; otherwise returns an error
  • If 0 , content of the output file will be in the database character set