SQLの構文解析SQLによる再生のためにログ生成XMLを生成

1)Oracleデータ・ディクショナリ・パス導出されるパラメータ(オプション)を設定

シャットダウン即時
ALTER SYSTEM SET UTL_FILE_DIR = 'は/ opt /オラクル/ UTL'スコープ= SPFILE; 
dbms_logmnr_d.build(dictionary_filename => 'logminer_dict.ora'、dictionary_locationに=> '/ OPT /オラクル/ UTL')を実行します。
起動

 

2)、分析するREDOログ・ファイルを(オンライン・アーカイブが可能です)増加

DBMS_LOGMNR.ADD_LOGFILE(ログファイル名=> '/ OPT /オラクル/ OraBase / oradataに/ inomc / REDO01.LOG'、オプション=> dbms_logmnr.new)を実行します。
DBMS_LOGMNR.ADD_LOGFILE(ログファイル名=> '/ OPT /オラクル/ OraBase / oradataに/ inomc / redo02.log'、オプション=> dbms_logmnr.new)を実行します。
DBMS_LOGMNR.ADD_LOGFILE(ログファイル名=> '/ OPT /オラクル/ OraBase / oradataに/ inomc / redo03.log'、オプション=> dbms_logmnr.new)を実行します。

3)実行ログローディング

データ・ディクショナリを使用します

DBMS_LOGMNR.START_LOGMNR(DictFileName => '/opt/oracle/utl/logminer_dict.ora')を実行します。

オンライン辞書を使用してください

(オプション=> dbms_logmnr.DICT_FROM_ONLINE_CATALOG)DBMS_LOGMNR.START_LOGMNRを実行します。

4)ログの表示

五$ LOGMNR_CONTENTS FROM SQL_REDOを選択します。

5)分析が終了し、アンインストールログは
DBMS_LOGMNR.END_LOGMNRを実行します。

 

PL / SQLでのXMLの使用では、Oracleは、開発者が容易にXML技術を活用することができ、いくつかのコンポーネントを提供します。これらのコンポーネントが含まれます:
1.XML解析プログラムを。これは、分析構築し、XML文書を検証するために使用しました。
2.XPathエンジン。それは、XPathを使用している(XML標準の別の要素)は、メモリ内のXML文書を検索するためのユーティリティの構文を示しています。SLTプロセッサ。それはあなたが他の形式にXML文書を変換することを可能にするOracleデータベースでXSLTをサポートしています。
3.XML SQLユーティリティ。あなたは簡単にOracleデータベースのテーブルにXMLベースのデータを挿入することができますので、あなたは、XML文書を生成するためにSQLを使用することができます。
PL / SQL Developerの、XMLパーサーは、最も重要な要素です。それを使用すると、Oracleデータベース内の分析操作およびXML文書を変換することができます。XML解析プログラムは、API(アプリケーションプログラミングインターフェイス)のセットで構成されています。

================================================== ================================================== ================================================== =============================

XMLは、生成し

、次のように、Test.xmlをを生成します

1
2
3
4
5
6
7
8
9
10
< staff  content = "name and id">
     < member >
       < name >Arwen</ name >
     < eno >123</ eno >
   </ member >
   < member >
       < name >Tom</ name >
     < eno >456</ eno >
   </ member >  
</ staff >

 PLSQLコードXMLの1世代。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
declare
     doc  XMLDOM.DOMDOCUMENT;
     doc_node  XMLDOM.DOMNODE;
     root_node  XMLDOM.DOMNODE;
     user_node XMLDOM.DOMNODE;
     item_node XMLDOM.DOMNODE;
     root_elmt XMLDOM.DOMELEMENT;
     user_elmt XMLDOM.DOMELEMENT;
     item_elmt XMLDOM.DOMELEMENT;
     item_text XMLDOM.DOMTEXT;
begin
    doc := XMLDOM.NEWDOMDOCUMENT;
    xmldom.setVersion(doc,  '1.0' );
    xmldom.setCharset(doc,  'UTF-8' );
    --根节点
    doc_node := XMLDOM.MAKENODE(doc);
    root_elmt := XMLDOM.CREATEELEMENT(doc, 'staff' );
    XMLDOM.SETATTRIBUTE(root_elmt, 'content ' , 'name and id' );
    root_node:=XMLDOM.APPENDCHILD(doc_node, XMLDOM.MAKENODE(root_elmt));
  
    --节点1
    user_elmt := XMLDOM.CREATEELEMENT(doc, 'member' );
    user_node :=XMLDOM.APPENDCHILD(root_node, XMLDOM.MAKENODE(user_elmt));
  
      item_elmt :=XMLDOM.CREATEELEMENT(doc, 'name' );
      item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
      item_text := XMLDOM.CREATETEXTNODE(doc, 'Arwen' );
      item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
     
      item_elmt :=XMLDOM.CREATEELEMENT(doc, 'eno' );
      item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
      item_text := XMLDOM.CREATETEXTNODE(doc, '123' );
      item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
     
      --节点2
      user_elmt := XMLDOM.CREATEELEMENT(doc, 'member' );
      user_node :=XMLDOM.APPENDCHILD(root_node, XMLDOM.MAKENODE(user_elmt));
  
      item_elmt :=XMLDOM.CREATEELEMENT(doc, 'name' );
      item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
      item_text := XMLDOM.CREATETEXTNODE(doc, 'tom' );
      item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
     
      item_elmt :=XMLDOM.CREATEELEMENT(doc, 'eno' );
      item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
      item_text := XMLDOM.CREATETEXTNODE(doc, '456' );
      item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
     
      --写入操作系统文件中
      XMLDOM.WRITETOFILE(doc, 'DIR' || '\Test.xml' ); --注意必须先创建一个文件目录dir
      --可以通过语句 : create or replace directory dir as 'd:\temp'
         XMLDOM.FREEDOCUMENT(doc);
  end ;

 2.将xml encode 成clob 写入文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
declare
     l_f utl_file.file_type;
     clobpart varchar2(2048);
     offset  integer ;
     l_xmltype XMLTYPE;
     cloblen  integer ;
     response_clob CLOB;
     resp_domdoc DBMS_XMLDOM.DOMDOCUMENT;
begin
     l_f  := utl_file.fopen( 'TEST_DIR' ,l_full_file_name, 'w' );
     utl_file.put_line(l_f, '<?xml version="1.0" encoding="utf-8" standalone="yes"?>' ||chr(13));
     resp_domdoc := SoapEncPrcnScnrPckgRead.encd_root_prcn_scnr_pckg_read(p_psp_resp_doc);
     l_xmltype := dbms_xmldom.getXmlType(resp_domdoc);
     dbms_xmldom.freeDocument(resp_domdoc);
     response_clob := l_xmltype.getClobVal;
     cloblen := LENGTH(response_clob);
     while offset < cloblen
     loop
         clobPart := dbms_lob.substr(response_clob, 1024, offset);
         utl_file.put(l_f, clobPart);
         offset := offset + 1024;
     end  loop;
     utl_file.fflush(l_f);
     utl_file.fclose(l_f);
end ;
/

 3.结合使用XMLDOM和utl_file
    这样生成XML文件非常方便,能满足一般的应用了.但是XMLDOM有个缺点,就是一次性在内存中生成所有xml文件内容,然后写入到磁盘文件中.如果 xml文件太大,比如说有个table有几个G,想把它保存成xml文件.这样可能就会出现内存不足,生成文件失败.那该咋整呢?
    可能首先想到的是用UTL_FILE去生成文件.
    里面的内容全部手动写成xml格式的,然后保存成xml后缀的文件.这样确实可行.但有个麻烦问题时如果一些节点内容含有xml的五个保留字符的话 (&,<,>,'," 分别是和号,小于号,大于号,单引号,双引号),我们如果以文本方式打开xml文件是看不到节点内容里面有这些保留字的,都转换成了对应 的&amp, &gt, &lt, &apos, &quot.节点指定的是上面的Arwen或123,假如有名字(A&r<w>e'n")则保存到xml文件中应该改成 (A&ampr&gtw&lte&aposn&quot).如果用xmldom会默认去转换,不用我们管了.如 果用UTL_FILE必须手动写代码去转换.
    假如有表staff(name varchar2(30), eno integer),里面有几个G的内容,要转换成开头讲的那种格式的xml文件。
    --生成xml的代码其中XML文件的头和尾用UTL_FILE直接写入文件中,节点内容用xmldom生成,然后写到clob变量中,再把clob变量值用utl_file写入到xml文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
declare
   STAFFINFO  UTL_FILE.FILE_TYPE;
   v_temp clob;
   cursor  c_table_info  is  select  name ,eno  from  staff;
   v_name varchar2(30);
   v_eno  integer ;
   doc  XMLDOM.DOMDOCUMENT;
   doc_node XMLDOM.DOMNODE;
   root_node XMLDOM.DOMNODE;
   user_node XMLDOM.DOMNODE;
   item_node XMLDOM.DOMNODE;
   root_elmt XMLDOM.DOMELEMENT;
   user_elmt XMLDOM.DOMELEMENT;
   item_elmt XMLDOM.DOMELEMENT;
   item_text XMLDOM.DOMTEXT;
begin
    --xml header
     STAFFINFO :=utl_file.fopen_nchar( 'DIR' , 'Test.xml' , 'W' ,32767); --跟前面说的一样必须先创建一个directory才行
     UTL_FILE.PUT_LINE_NCHAR(STAFFINFO , '<staff content = "name and id">' );
     UTL_FILE.FFLUSH(STAFFINFO ); --直接写入到磁盘文件中,不会停留在内存中
     UTL_FILE.FCLOSE(STAFFINFO );
         open  c_table_info;
         loop
             fetch  c_table_info  into  v_name,v_eno;
             exit  when  c_table_info%notfound;
        --XML节点
           doc := XMLDOM.NEWDOMDOCUMENT;
         xmldom.setCharset(doc,  'UTF-8' );
       doc_node := XMLDOM.MAKENODE(doc);
       user_elmt := XMLDOM.CREATEELEMENT(doc, 'member' );
            user_node :=XMLDOM.APPENDCHILD(doc_node, XMLDOM.MAKENODE(user_elmt));
       item_elmt :=XMLDOM.CREATEELEMENT(doc, 'name' );
       item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
       item_text := XMLDOM.CREATETEXTNODE(doc,v_name);
       item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
       item_elmt :=XMLDOM.CREATEELEMENT(doc, 'eno' );
       item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
       item_text := XMLDOM.CREATETEXTNODE(doc, 'eno' );
       item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
       v_temp := ' ' ;
         --写入到临时变量v_temp中
       XMLDOM.WRITETOCLOB(doc,v_temp);
       STAFFINFO :=utl_file.fopen_nchar( 'DIR' , 'Test.xml' , 'A' ,32767); --以a模式会在文件后添加内容,用w会覆盖之前的内容
       UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,v_temp);
       UTL_FILE.FFLUSH(STAFFINFO );
       UTL_FILE.FCLOSE(STAFFINFO );
       XMLDOM.FREEDOCUMENT(doc);
     end  loop;
     close  c_table_info;
     --xml tail
     STAFFINFO :=utl_file.fopen_nchar( 'DIR' , 'Test.xml' , 'a' ,32767);
     UTL_FILE.PUT_LINE_NCHAR(STAFFINFO , '</staff>' );
     UTL_FILE.FFLUSH(STAFFINFO );
     UTL_FILE.FCLOSE(STAFFINFO );
end ;

 

おすすめ

転載: www.cnblogs.com/klb561/p/10962866.html