今天实际项目中用到了spool,发现网上好多内容不是很全,自己摸索了好半天,现在总结一下。

一、通过spool 命令,可以将select 数据库的内容写到文件中,通过在sqlplus设置一些参数,使得按指定方式写到文件中

(1)常规使用spool方法,将set的一些命令和spool,select等放入.sql脚本中,然后再sqlplus中运行该脚本。以下为logmnr.sql脚本,

[email protected]。不会再终端显示任何信息。但是,如果是在sqlplus中输入:

set termout off;

......

spool record3.txt

select ....... from .....;

spool off;

前面的设置是没有用的,还是会在终端中显示大量信息。

1 set echo off;2 set heading off;3 set line 100;4 set long 2000000000;5 set longchunksize 255;6 set wra on;7 setnewpage none;8 set pagesize 0;9 set numwidth 12;10 set termout off;11 set trimout on;12 set trimspool on;13 set feedback off;14 set timing on;15 execute dbms_logmnr.add_logfile(LogFileName=>‘/oracle/app/oracle/logs/hrbfct_1_4156_748575599.arc‘,Options=>dbms_logmnr.new);16 execute dbms_logmnr.add_logfile(LogFileName=>‘/oracle/app/oracle/logs/hrbfct_2_6645_748575599.arc‘,Options=>dbms_logmnr.addfile);17 execute dbms_logmnr.start_logmnr(DictFileName=>‘/oracle/app/oracle/logs/dict.ora‘);18 spool /oracle/app/oracle/logs/record3.txt;19 select to_clob(sql_redo)||‘|‘||to_char(scn)||‘|‘||to_char(timestamp)||‘|‘||to_char(session_info)||‘|‘||to_char(table_name)||‘|‘||to_char(seg_owner)||‘?‘

20 fromv$logmnr_contents;21 spool off;22 exit;

(2)那到底能否在shell脚本中运行还不显示这些信息呢,答案是有的。

例如

1 #!/bin/ksh2 echo "set echo off;3 set heading off;4 set line 100;5 set long 2000000000;6 set longchunksize 255;7 set wra on;8 setnewpage none;9 set pagesize 0;10 set numwidth 12;11 set termout off;12 set trimout on;13 set trimspool on;14 set feedback off;15 set timing on;16 execute dbms_logmnr.add_logfile(LogFileName=>‘/oracle/app/oracle/logs/hrbfct_1_4156_748575599.arc‘,Options=>dbms_logmnr.new);17 execute dbms_logmnr.start_logmnr(DictFileName=>‘/oracle/app/oracle/logs/dict.ora‘);18 spool /oracle/app/oracle/logs/record3.txt;19 select to_clob(sql_redo)||‘|‘||to_char(scn)||‘|‘||to_char(timestamp)||‘|‘||to_char(session_info)||‘|‘||to_char(table_name)||‘|‘||to_char(seg_owner)||‘?‘

20 fromv\$logmnr_contents;21 spool off;22 " | sqlplus ‘/as sysdba‘>/dev/null

这样就能利用shell脚本中执行spool方法,同时不会再终端中显示。注意,只有这种方法可以。

试过这种方法,结果证明是不行的。。。。

看着和上面echo进去很像,但事实就是不行,还是会显示大量的信息,两个!就是将中间内容发送到sqlplus中作为输入

1 #!/bin/bash2 ......3 .....4 sqlplus oracleuser/user@SERVICE_NAME <

6 set heading off

7 set pagesize 0

8 set linesize 1000

9 set term off

10 set trims on

11 set feedback off

12 spool $tmpfile13 select owner||‘.‘||table_name||‘,‘ from all_tables where owner=upper(‘$owner_user‘) and table_name like ‘DR%$exp_month%‘;14 spool off

15 quit16 !17 .......

(2)spool通常会用到连接||,这里讲一下连接是怎么回事SQL> SELECT LPAD(‘x‘,4000,‘x‘) || LPAD(‘x‘,4000,‘x‘) || LPAD(‘x‘,4000,‘x‘) FROM DUAL;

SELECT LPAD(‘x‘,4000,‘x‘) || LPAD(‘x‘,4000,‘x‘) || LPAD(‘x‘,4000,‘x‘) FROM DUAL

*

ERROR at line 1:

ORA-01489: result of string concatenation is too long

这里简单先介绍下lpad和rpad是怎么回事:(l,r只是方向不同)

rpad函数从右边对字符串使用指定的字符进行填充

rpad(string,padded_length,[pad_string])

string 表示:被填充的字符串

padded_length 表示:字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,rpad函数将会把字符串截取成从左到右的n个字符;

pad_string 是个可选参数,这个字符串是要粘贴到string的右边,如果这个参数未写,lpad函数将会在string的右边粘贴空格。

例如:

rpad(‘tech‘, 7); 将返回‘tech ‘

rpad(‘tech‘, 2); 将返回‘te‘

rpad(‘tech‘, 8, ‘0‘); 将返回‘tech0000‘

rpad(‘tech on the net‘, 15, ‘z‘); 将返回 ‘tech on the net‘

rpad(‘tech on the net‘, 16, ‘z‘); 将返回 ‘tech on the netz‘

好了,现在回到上面的问题,为什么会出错呢,因为varchar2在oracle中,最多只支持到4000个字符,也就是32K,||的操作会把后面的放入到前面里,就是把后面4000个x放入到

前一个4000个x里,作为varchar2,当然就超过了4000的界限。Problem Description:

The problem with this query is with the use of CONCAT operator (||).

e.g.: select char1 || char2 from dual

Concat operator returns char1 concatenated with char2. The string returned is in the

same character set as char1. So here concat operator is trying to return varchar2,

which has limit of 4000 characters and getting exceeded.

This problem may also come when we try to CONCAT a VARCHAR2 with CLOB.

e.g.: select char1 || clob from dual

So here we can simply convert its first string to CLOB and avoid this error.

After converting first string to CLOB, CONCAT operator will return string of CLOB type

Solution:

SELECT TO_CLOB(LPAD(‘x‘,4000,‘x‘)) || LPAD(‘x‘,4000,‘x‘) || LPAD(‘x‘,4000,‘x‘)

FROM DUAL

所以问题解决了,只需要将连接的第一个转换成clob就可以。

看我上面的logminer.sql,我将sql_redo用to_clob函数转换成了clob类型,如果不设置set long 20000000和set longchunksize 255;就会发现,在record3文档中每行只有

前80个字符,剩下的都被截断了,这就是我上篇博客中的clob截断问题,所以用上篇博客的方法可以完美解决问题。欧耶!

(3)shell调用spool 的另一种方法,

那就是在shell中调用selecttpmof03.txt

1 set heading off

2 set feedback off

3 set echo off

4 setnewp none5 set termout off

6 spool /home/orarun/scripts/date.txt7 select a.REC_CREATOR||‘|‘||a.REC_CREATE_TIME||‘|‘||b.event_name||‘|‘||a.ORDER_NO||‘|‘||a.MAT_NO||‘|‘||a.MAT_STATUS||‘|‘||a.WT from tpmof03 a,tpmof21 b where (a.event_id=b.event_id and a.event_id in(‘52‘,‘6A‘,‘6B‘,‘6C‘,‘6D‘,‘5B‘))and (a.rec_create_time>=‘20120101000000‘);8 spool off;

1 #!/bin/sh

2

3 rm /home/orarun/scripts/date.txt4

5 sqlplus [email protected] <

7 @selecttpmof03.txt #或者sqlplus [email protected]8

9 EOF

这种方法理论上也不会在终端上显示信息,不知道为啥上面那个用!的就不行,感觉差不多的样子

(4)还有一种想法可以在shell脚本中编写出一个.sql脚本,然后去执行它。

1 #!/bin/ksh2 record=/oracle/app/oracle/logs/dirct3 flag=0

4 count=1

5 echo "set echo off;

6 set heading off;7 set line 100;8 set long 2000000000;9 set longchunksize 255;10 set wra on;11 set newpage none;12 set pagesize 0;13 set numwidth 12;14 set termout off;15 set trimout on;16 set trimspool on;17 set feedback off;18 set timing on;"> logmnr.sql

19 echo "write config"

20 for file_i in `cat$record`;21 do

22 flag=1

23 if [ $count -eq 1 ];then

24 sed -i ‘/‘‘‘$file_i‘‘‘/d‘$record25 echo "execute dbms_logmnr.add_logfile(LogFileName=>‘/oracle/app/oracle/logs/$file_i‘,Options=>dbms_logmnr.new);">>logmnr.sql26 count=0

27 else

28 sed -i ‘/‘‘‘$file_i‘‘‘/d‘$record29 echo "execute dbms_logmnr.add_logfile(LogFileName=>‘/oracle/app/oracle/logs/$file_i‘,Options=>dbms_logmnr.addfile);">>logmnr.sql30 fi

31 done

32 echo "execute dbms_logmnr.start_logmnr(DictFileName=>‘/oracle/app/oracle/logs/dict.ora‘);">>logmnr.sql33 if [ $flag -eq 1 ];then

34 echo "spool /oracle/app/oracle/logs/record3.txt;

35 select to_clob(sql_redo)||‘|‘||to_char(scn)||‘|‘||to_char(timestamp)||‘|‘||to_char(session_info)||‘|‘||to_char(table_name)||‘|‘||to_char(seg_owner)||‘?‘

36 from v\$logmnr_contents;37 spool off;38 exit;">>logmnr.sql

39 #sqlplus ‘/as sysdba‘@logmnr.sql

原文:http://www.cnblogs.com/zmlctt/p/3721188.html

java oracle spool,oracle之spool详细使用总结相关推荐

  1. oracle spool文件路径,spool找相对路径

    C:\Users\lastwinner>sqlplus ****/**** SQL*Plus: Release 11.2.0.1.0 Production on 星期六 2月 16 14:49: ...

  2. oracle @spool,Oracle Spool详解

    1.spool的作用是什么? spool的作用可以用一句话来描述:在sqlplus中用来保存或打印查询结果. 2.spool在oracle 9i.10g和11g下的语法及使用示例 oracle 9i ...

  3. Oracle sqlplus的set命令详细使用和设置

    Oracle sqlplus的set命令详细使用和设置 SQL*Plus是Oracle提供的访问数据库服务器的客户端软件,是Oracle的核心组件,也是Oracle DBA最常用的工具. 1.1  s ...

  4. Java EE与Java SE:Oracle是否放弃了企业软件?

    Java Enterprise Edition是全球Java社区中最大的困惑来源之一. 就像<星球大战>和<星际迷航 >之间的区别一样,对于"原力觉醒"是他 ...

  5. oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...

    本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...

  6. redhat 下 oracle 10G RAC 集群 详细安装

    在大家做RAC安装测试搭建环境时,没有存储环境下,我来教大家怎么采用虚拟机来安装 ORACLE 10 rac,这样可以让大家更快学习好 ORACLE 10 RAC ,我会把很详细的安装写给大家. 1. ...

  7. java 创建oracle链接_使用Java创建与oracle db的ssl连接

    我正在尝试使用 Java和SSL连接到Oracle数据库.现在我在服务器上有数据库的Java程序. 我尝试运行它时收到此错误(注释中的完整错误): java.sql.SQLRecoverableExc ...

  8. java代码连接oracle数据库连接_在JAVA中连接Oracle数据库(例子)

    * TODO 要更改此生成的文件的模板,请转至 * 窗口 - 首选项 - java - 代码样式 - 代码模板 */ package person.fane.test; import java.sql ...

  9. 甲骨文正式发布Java 14(Oracle JDK 14)

    甲骨文两年来,每六个月如约发布新版本的Java,Oracle JDK 14为开发人员带来创新功能和新特性预览.Oracle JDK 14增加了一些新特性来提高开发人员工作效率,这些新特性包括:对swi ...

  10. cacti监控java,Cacti for Oracle监控

    Cacti关于Oracle数据库的监控 OMA10g的安装 5.1.1 介绍 OEM管理升级到10以后必须安装OMA才支持SNMP管理,而ORACLE给出的SNMP支持是到2018年,所以建议ORAC ...

最新文章

  1. 3年国奖、一作9篇SCI,完美逆袭的中大博士坦言自己也曾濒临挂科
  2. (六)Amazon Lightsail 部署LAMP应用程序之升级到Amazon EC2
  3. mysql相同姓名只显示第一条_SQL中遇到多条相同内容只取一条的最简单实现方法...
  4. 一直认为 count(1) 比 count(*) 效果高,被同事鄙视了。
  5. 从0到掌握Java泛型有这一篇博客就够了
  6. sqoop操作之Oracle导入到HDFS
  7. 学习 Linux/C/C++ 必备资料
  8. 【面试准备·2】webpack
  9. html 5新增技术,HTML5新增标签
  10. 基于PSR-0编码规范开发一套PHP-MVC框架(二)
  11. linux集群100道单选题面试试题系统工程师中级试题(4)
  12. 抽象工厂模式(Abstract Factory)及代码实现
  13. CSS3:颜色渐变和重复性渐变
  14. 计算机网络实训心得总结,计算机网络实训心得体会_计算机网络学习经验总结...
  15. 计算机冰雪世界教案,教案有趣的冰
  16. python 解决 0-1 二维背包问题
  17. Python for everyone chapter 1
  18. Vue学习(二)动态绑定与事件监听
  19. miui v5 android版本,速度明显提升 小米2S刷安卓4.4版MIUI V5
  20. Dw2021下载安装教程

热门文章

  1. Web浏览器已经限制此文件显示
  2. 关于JM8.6中MAX_LIST_SIZE值的选取
  3. 2017.07.16小组赛题目I
  4. wince6.0添加组件_WINCE6.0添加对viewrs(PDF,Word,Execel和PowerPoint)支持
  5. 【GIS教程】土地利用转移矩阵
  6. mem考试能用计算机吗,东华大学计算机学院MEM难考吗
  7. 天翼宽带怎么开虚拟服务器,天翼宽带怎么设置无线路由器?
  8. mysql split 分割文件名_【原】mysql5.6 split函数_字符串的分割
  9. 基于bootstrap的双边栏选择框_iphone自带Dock栏美化功能,你out了
  10. 哪里有c语言在线编程题,在线求C语言编程题答案。。。