For playback by SQL parsing SQL generate log generation xml

1) Set the Oracle data dictionary path derived parameters (optional)

shutdown immediate
alter system set UTL_FILE_DIR='/opt/oracle/utl' scope=spfile; 
execute dbms_logmnr_d.build(dictionary_filename => 'logminer_dict.ora', dictionary_location => '/opt/oracle/utl');
startup

 

2) increase the redo log files to be analyzed (online archives are available)

execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo01.log', options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo02.log', options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo03.log', options=>dbms_logmnr.new);

3) execution log loading

Use the data dictionary

execute dbms_logmnr.start_logmnr(DictFileName=> '/opt/oracle/utl/logminer_dict.ora') ;

Use the online dictionary

execute dbms_logmnr.start_logmnr(Options=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG) ;

4) View Log

SELECT sql_redo FROM v$logmnr_contents;

5) analysis is finished, the uninstall log
execute dbms_logmnr.end_logmnr;

 

In the use of XML in PL / SQL, Oracle provides several components, allowing developers to easily leverage XML technology. These components include:
1.XML analysis program. That used to analyze, construct and validate XML documents.
2.XPath engine. It is using Xpath (another element of the XML standard) illustrates utility syntax for searching XML documents in memory. SLT processor. It supports XSLT in the Oracle database that allows you to transform XML documents into other formats.
3.XML SQL utility. You can use SQL to generate XML documents, so you can easily insert in Oracle database tables XML-based data.
For PL / SQL Developer, XML parser is the most important component. With it, you can analyze in the Oracle database, manipulate and transform XML documents. XML analysis program consists of a set of APIs (application programming interfaces).

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

xml generate

generating Test.xml, as follows

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 >

 1. generation of plsql code 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
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 ;

 

Guess you like

Origin www.cnblogs.com/klb561/p/10962866.html