ITPub博客

首页 > 数据库 > Oracle > [20211108]sqlplus管道过滤.txt

[20211108]sqlplus管道过滤.txt

原创 Oracle 作者:lfree 时间:2021-11-09 08:39:43 0 删除 编辑

[20211108]sqlplus管道过滤.txt

--//我的同事基本不使用sqlplus,我自己开始学习oracle时,也是很不习惯使用,有时候某列超长,很给使用column修改。
--//还给设置pagesize,linesize大小,当然这些还给面对屏幕显示混乱的情况,使用上可以使用管道以及过滤来达到好的显示效果。

--//BTW,我现在是很少用这种方式,一般超长显示我会使用prxx.sql脚本(从tanel poder的pr.sql)修改而来。
--//我一般在linux下使用我会启动tmux下使用,tmux下可以prefix-key ,[ ,?  来查询特定字符串,这样便于我查找需要的信息。

--//通过简单的例子介绍sqlplus下使用管道以及过滤。

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

--//建立管道文件。

$ mkfifo /tmp/oop.pipe
$ ls -l /tmp/oop.pipe
prw-r--r-- 1 oracle oinstall 0 2021-11-08 15:33:27 /tmp/oop.pipe

2.测试1:
--//打开两个shell窗口:
--//window 1:
$ echo "select sysdate from dual ;" > /tmp/oop.pipe
--//注意加引号。

--//window 2,启动sqlplus:
SCOTT@book> @ /tmp/oop.pipe

SYSDATE
-------------------
2021-11-08 15:35:31

--//window 1:
$ echo "@dpc '' ''"> /tmp/oop.pipe

--//window 2:
SCOTT@book> @ /tmp/oop.pipe
--//显示执行计划,输出略。

--//window 1:
$ seq 10 10 40 | xargs -IQ echo "select * from dept where deptno=Q;" > /tmp/oop.pipe

--//window 2:
SCOTT@book> set echo on
SCOTT@book> @ /tmp/oop.pipe
SCOTT@book> select * from dept where deptno=10;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

SCOTT@book> select * from dept where deptno=20;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS

SCOTT@book> select * from dept where deptno=30;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        30 SALES          CHICAGO

SCOTT@book> select * from dept where deptno=40;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        40 OPERATIONS     BOSTON

--//设置echo on,可以显示执行的命令。

3.测试2:
--//实际上这个我以前都讲过:
--//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

SCOTT@book> set describe DEPTH 2 LINENUM ON INDENT ON
SCOTT@book> set colsep |
--//目的就是desc前面输出有行号,可以标识那个字段显示位置。
--//建立一个脚本:
$ cat prp.sql
spool /tmp/oop.pipe
@ prxx
spool off

--//window 1:
$ tail -n 2000 -f /tmp/oop.pipe
--//注意先执行以上这步,不然下面spool /tmp/oop.pipe 时挂住。

--//window 2:
SCOTT@book> select * from v$database;
SCOTT@book> @ prp

--//window 1:
--//按ctrl+c中断,然后打入如下,然后在windows 2执行 @ prp就ok了。
$ tail -n 2000 -f /tmp/oop.pipe | grep -n SUPP
33:SUPPLEMENTAL_LOG_DATA_MIN     : NO
34:SUPPLEMENTAL_LOG_DATA_PK      : NO
35:SUPPLEMENTAL_LOG_DATA_UI      : NO
43:SUPPLEMENTAL_LOG_DATA_FK      : NO
44:SUPPLEMENTAL_LOG_DATA_ALL     : NO
54:SUPPLEMENTAL_LOG_DATA_PL      : NO
--//减去3对应字段序号。

--//window 2:
SCOTT@book> set colsep |
SCOTT@book> set linesize 20000
SCOTT@book> @ desc v$database
...
   11      CONTROLFILE_TYPE                         VARCHAR2(7)
   12      CONTROLFILE_CREATED                      DATE
   13      CONTROLFILE_SEQUENCE#                    NUMBER
   14      CONTROLFILE_CHANGE#                      NUMBER
   15      CONTROLFILE_TIME                         DATE
....

--//window 1:
--//修改如下:
$ tail -n 2000 -f /tmp/oop.pipe | cut -d"|" -f11,12,13,14,15
SCOTT@book> select * from v$database;
CONTROL|CONTROLFILE_CREATED|CONTROLFILE_SEQUENCE#|CONTROLFILE_CHANGE#|CONTROLFILE_TIME
-------|-------------------|---------------------|-------------------|-------------------
CURRENT|2015-11-24 09:11:10|                54493|        13382769951|2021-11-08 16:22:44

--//window 2:
spool /tmp/oop.pipe
select * from v$database;
spool off



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2841205/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969820