1)设置Oracle数据字典导出路径参数(可选)

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)增加需要分析的重做日志文件(在线归档均可)

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)执行日志加载

使用数据字典

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

使用在线字典

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

4)查看日志

SELECT sql_redo FROM v$logmnr_contents;

5)结束分析,卸载日志
execute dbms_logmnr.end_logmnr;

在PL/SQL中利用XML ,Oracle提供了几个组件,让开发人员能轻松地利用XML技术。这些组件包括:
1.XML分析程序。即用来分析、构造和验证XML文档。
2.XPath引擎。它是使用Xpath(XML标准的另一个元素)说明语法在内存中搜索XML文档的实用程序。SLT处理器。它在Oracle数据库中支持XSLT,允许您把XML文档转换成其他格式。
3.XML SQL实用程序。可以使用SQL产生XML文档,使您可以在Oracle数据库表格中轻松地插入基于XML的数据。
对于PL/SQL开发人员而言,XML分析程序是最重要的组件。通过它,您可以在Oracle数据库中分析、操纵和转换XML文档。XML分析程序由一套APIs(应用程序编程接口)构成。

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

xml generate

生成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>

1.生成xml的plsql code:

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;

通过generate解析SQL日志生成xml进行SQL回放的更多相关文章

  1. ADO.NET 快速入门(十二):从 SQL Server 生成 XML 数据

    本文演示如何使用2种不同的方法从 SQL Server 生成 XML.   方法1:使用了 SqlCommand 的 ExecuteXmlReader 方法获取 XmlReader,然后使用 Data ...

  2. mysql 打开sql日志,记录所有sql

    我使用的mysql版本为:5.7.11 win7环境 记录下下载地址,省得每次百度搜了:http://dev.mysql.com/downloads/installer/ mysql 默认没有开启sq ...

  3. sql server 生成数据库字典 sql语句

    SELECT TOP 100 PERCENT --a.id,          CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,      ...

  4. java 解析并生成 XML

    在 java 中使用 Dom4j 解析 XML 对 XML 文件的解析,通常使用的是 Dom4j 和 jdom 作为XML解析工具. 在此只介绍下 Dom4j 对 XML 文件的解析使用方法. 1. ...

  5. sql server 操作xml例子

    sql server 操作xml例子 /* sql xml 入门: --by jinjazz --http://blog.csdn.net/jinjazz 1.xml: 能认识元素.属性和值 2.xp ...

  6. Android 下用 Pull 解析和生成 XML

    Java 中是可以用 SAX 和 DOM 解析 XML  的,虽然在 Android 下也可以用这2中方式,但是还是推荐用 Pull.Pull 使用简单,效率相对高,Android 下是集成了 Pul ...

  7. maven中使用dom4j解析、生成XML的简易方法

    此片文章主要写一些关于如何在maven工程中使用dom4j来解析或生成XML的建议方法,实际可使用的写法不仅限于如下所写的样例代码.此处进攻快速入手和提供思路使用. 首先配置pom.xml中的依赖的包 ...

  8. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  9. 使用XML序列化器生成XML文件和利用pull解析XML文件

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

随机推荐

  1. Java流对象:InputStream、OutputStream、Reader、Writer

    流对象使用完一般要用close方法关闭.释放资源. InputStream 和OutPutStream 二者都是字节输入和输出的抽象父类,子字节为单位处理数据,每次读取.写入一个字节,适合处理二进制文 ...

  2. 【Hibernate】事务处理

    一.概述 一.概述 事务 事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!! 事务特性 原子性:事务一组操作不可分割. 一致性:事务的执行前后,数据完整性要保持一致. 隔离性:一个事务在执行的 ...

  3. Django drf:幂等性

    一.什么叫做幂等性 用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用.举个最简单的例子,那就是支付,用户购买商品使用约支付,支付扣款成功,但是返回结果的时候网络 ...

  4. Vue下的package.json

    { "name": "demo2", "version": "1.0.0", "description&quo ...

  5. Jupyter Notebook 插件安装

    刚才安装notebook插件jupyter_contrib_nbextensions,搜了很多教程都没有作用.直到用了这个命令,一行解决. pip install jupyter_contrib_nb ...

  6. NLP学习(3)---Bert模型

    一.BERT模型: 前提:Seq2Seq模型 前提:transformer模型 bert实战教程1 使用BERT生成句向量,BERT做文本分类.文本相似度计算 bert中文分类实践 用bert做中文命 ...

  7. 一步一步pwn路由器之wr940栈溢出漏洞分析与利用

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...

  8. nginx 重发机制导致的重复扣款问题

    问题:    nginx 重发机制导制重复提交(客户还款,被扣俩笔款,前端调用一次,后端执行2次) proxy_next_upstream 语法: proxy_next_upstream error ...

  9. TreadPool

    ThreadPool概述 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 I/O.代表其他线程等待以及处理计时器. 创建线程需要时间.如果有不同的小任务要完成,就可以事先创建许多线程/在 ...

  10. 打包完的rcp产品svn不储存密码问题

    原因是缺少org.eclipse.core.runtime.compatibility.auth 这个依赖,需要添加到依赖中去 因为使用SVNKit的时候会去调eclipse这个api 详情见: ht ...