ストレージ・プロシージャを使用して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で使用するプロセスの説明を貼り付けて、参考にしてください.
This procedure writes content of a
Syntax
Parameter Description
File directory
File directory
File name
Character set id of the file Must be a valid Oracle id; otherwise returns an error If
一、準備
データの準備:
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
0
, content of the output file will be in the database character set