[20191104]sqlplus 管道文件 过滤.txt --//前一段时间知道链接https://connor-mcdonald.com/2019/05/28/dbms_job-the-joy-of-transactions/ --//里面pr.sql脚本如何实现的. --//实际上受限sqlplus的显示限制,有时候确实需要某种过滤功能.比如如果显示信息太多,使用pr.sql脚本查看也是不是很方便. --//实际上mysql就有这个功能,通过定义pager实现过滤. --//很久以前我写过一篇链接:http://blog.itpub.net/267265/viewspace-1062965/=>[20131211]mysql pager定义=vim.txt --//我一直很想在sqlplus实现类似的功能,链接: --//http://blog.itpub.net/267265/viewspace-2285749/=>[20181219]script使用小技巧.txt --//http://blog.itpub.net/267265/viewspace-2375095/=>[20190108]rlwrap sqlplus tee相关问题.txt --//http://blog.itpub.net/267265/viewspace-2375436/=>[20190110]rlwrap sqlplus tee相关问题3.txt --//今天测试看看是否通过管道实现,最大的问题就是缓存的问题.通过例子说明: 1.环境: SCOTT@book> @ ver1 PORT_STRING VERSION BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 2.测试 $ mknod /tmp/oop.pipe p $ ls -l /tmp/oop.pipe prw-r--r-- 1 oracle oinstall 0 2019-11-04 10:44:02 /tmp/oop.pipe --//seesion 1: SCOTT@book> spool /tmp/oop.pipe SCOTT@book> select * from dept ; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON --//seesion 2: $ tail -f /tmp/oop.pipe --//你可以发现seesion 2并没有输出.缓存的作用.必须执行spool off,session 2 的tail -f才会输出. 3.利用这个特性可以执行如下: --//seesion 1: spool /tmp/oop.pipe select * from v$database @ prxx spool off --//seesion 2: $ tail -f /tmp/oop.pipe | grep SUPP SUPPLEMENTAL_LOG_DATA_MIN : YES SUPPLEMENTAL_LOG_DATA_PK : NO SUPPLEMENTAL_LOG_DATA_UI : NO SUPPLEMENTAL_LOG_DATA_FK : NO SUPPLEMENTAL_LOG_DATA_ALL : NO SUPPLEMENTAL_LOG_DATA_PL : NO 4.你也可以建立如下脚本: $ cat prp.sql spool /tmp/oop.pipe @ prxx spool off --//session 1先执行: select * from v$database; --//session 2执行: $ tail -f /tmp/oop.pipe | grep SUPP --//session 1执行: @ prp --//由于缓存影响,最好执行2次.避免信息混乱,你可以在session 2上先会几个回车,再在session 1上执行. $ tail -f /tmp/oop.pipe | egrep "_CHANGE|SUPP" SUPPLEMENTAL_LOG_DATA_PL : NO MIN_REQUIRED_CAPTURE_CHANGE# : RESETLOGS_CHANGE# : 925702 PRIOR_RESETLOGS_CHANGE# : 1 CHECKPOINT_CHANGE# : 45243913791 ARCHIVE_CHANGE# : 45243779946 CONTROLFILE_CHANGE# : 45243917934 ARCHIVELOG_CHANGE# : 45243913791 SUPPLEMENTAL_LOG_DATA_MIN : YES SUPPLEMENTAL_LOG_DATA_PK : NO SUPPLEMENTAL_LOG_DATA_UI : NO SUPPLEMENTAL_LOG_DATA_FK : NO SUPPLEMENTAL_LOG_DATA_ALL : NO SUPPLEMENTAL_LOG_DATA_PL : NO MIN_REQUIRED_CAPTURE_CHANGE# : --//这样就不需要锻炼眼力了. 5.继续测试: --//session 1: SCOTT@book> set linesize 20000 SCOTT@book> set colsep | SCOTT@book> spool /tmp/oop.pipe SCOTT@book> @ desc v$database SCOTT@book> spool off --//session 2: $ tail -f /tmp/oop.pipe | egrep "SUPP" 30 SUPPLEMENTAL_LOG_DATA_MIN VARCHAR2(8) 31 SUPPLEMENTAL_LOG_DATA_PK VARCHAR2(3) 32 SUPPLEMENTAL_LOG_DATA_UI VARCHAR2(3) 40 SUPPLEMENTAL_LOG_DATA_FK VARCHAR2(3) 41 SUPPLEMENTAL_LOG_DATA_ALL VARCHAR2(3) 51 SUPPLEMENTAL_LOG_DATA_PL VARCHAR2(3) --//可以确定这些相关列在30,31,32,40,41,51. --//sesson 2先执行: $ tail -f /tmp/oop.pipe | cut -d"|" -f30,31,32,40,41,51 --//session 1: SCOTT@book> spool /tmp/oop.pipe SCOTT@book> select * from v$database; SCOTT@book> spool off --//sesson 2的输出: SCOTT@book> select * from v$database ; SUPPLEME|SUP|SUP|SUP|SUP|SUP --------|---|---|---|---|--- YES |NO |NO |NO |NO |NO --//你也可以将prp.sql脚本修改如下,不过这样必须先在session 1执行命令,这里是select * from v$database;: $ cat prp.sql spool /tmp/oop.pipe / spool off 6.prxx脚本如下: --//前面的点可不是多余的.如果windows下执行,必须修改_pr_tmpfile定义,以及host rm改为host del. $ cat prxx.sql . set termout off def _pr_tmpfile=/tmp/pr.out store set &_pr_tmpfile.set replace set termout on set serverout on size 1000000 termout off echo off save &_pr_tmpfile replace set termout on 0 c clob := q'\ 0 declare 999999 \';; 999999 l_theCursor integer default dbms_sql.open_cursor;; 999999 l_columnValue varchar2(4000);; 999999 l_status integer;; 999999 l_descTbl dbms_sql.desc_tab;; 999999 l_colCnt number;; 999999 begin 999999 dbms_sql.parse( l_theCursor, c, dbms_sql.native );; 999999 dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );; 999999 for i in 1 .. l_colCnt loop 999999 dbms_sql.define_column( l_theCursor, i, 999999 l_columnValue, 4000 );; 999999 end loop;; 999999 l_status := dbms_sql.execute(l_theCursor);; 999999 while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop 999999 dbms_output.put_line( '==============================' );; 999999 for i in 1 .. l_colCnt loop 999999 dbms_sql.column_value( l_theCursor, i, 999999 l_columnValue );; 999999 dbms_output.put_line 999999 ( rpad( l_descTbl(i).col_name, 999999 30 ) || ': ' || l_columnValue );; 999999 end loop;; 999999 end loop;; 999999 exception 999999 when others then 999999 dbms_output.put_line(dbms_utility.format_error_backtrace);; 999999 raise;; 999999 end;; / set termout off @&_pr_tmpfile.set get &_pr_tmpfile nolist host rm &_pr_tmpfile set termout on
[20191104]sqlplus 管道文件 过滤.txt
来源:这里教程网
时间:2026-03-03 14:27:40
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 云栖大会SaaS加速器专场 | 阿里云朱以军:阿里云心选——面向渠道商的商业红利
- 关于等待事件cursor: pin S
关于等待事件cursor: pin S
26-03-03 - 等待事件enq: TX - row lock contention
等待事件enq: TX - row lock contention
26-03-03 - VPGAME 的 Kubernetes 迁移实践
VPGAME 的 Kubernetes 迁移实践
26-03-03 - 关于RAC的remote_listener
关于RAC的remote_listener
26-03-03 - 阿里云智能推荐AIRec产品介绍
阿里云智能推荐AIRec产品介绍
26-03-03 - navicat 移动字段序列
navicat 移动字段序列
26-03-03 - ORA-00600 qosdExpStatRead expcnt mismatch
- 浅析阿里云API网关的产品架构和常见应用场景
浅析阿里云API网关的产品架构和常见应用场景
26-03-03 - 阿里小程序Serverless 操作指南
阿里小程序Serverless 操作指南
26-03-03
