[20211108]sqlplus管道過濾.txt

lfree發表於2021-11-09

[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部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2841205/,如需轉載,請註明出處,否則將追究法律責任。

相關文章