文章目錄
0、參考資料
參考官方文檔:SQL*Plus® User’s Guide and Reference
https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_three.htm#SQPUG013
文章以oracle 11g r2爲例,11g+版本會有新功能的增強,不過變化不大。
1、sqlplus使用技巧案例
1.1、設置個securecrt按鈕,防止誤操作庫
主要是把數據庫實例名提示出來:
set sqlprompt _user'@'_connect_identifier>
set serveroutput on
set long 5000
set linesize 200
set pagesize 9999
col member for a60
1.2、Thomas Kyte大神的SQL*PLUS設置例子
sqlplus在啓動時會自動運行兩個腳本:glogin.sql、login.sql這兩個文件。
執行順序:
先判斷是否設置SQLPATH環境變量,如果設置了該變量則在對應路徑下查找並執行
1.默認在在$ORACLE_HOME/sqlplus/admin路徑下查找glogin.sql文件執行
2.默認在sqlplus當前路徑下$ORACLE_HOME/bin查找login.sql文件執行
Thomas Kyte大神的glogin.sql或者login.sql腳本如下:
set serveroutput on size 1000000
set trimspool on
set long 5000
set linesize 100
set pagesize 9999
column plan_plus_exp format a80
column global_name new_value gname
set termout off
define gname=idle
column global_name new_value gname
select lower(user) || '@' || substr( global_name, 1, decode( dot, 0,length(global_name), dot-1) ) global_name
from
(select global_name, instr(global_name,'.') dot from global_name );
set sqlprompt '&gname> '
set termout on
說明:
(1)set serveroutput on size 1000000:
這會默認地打開DBMS_OUTPUT(這樣就不必每次再鍵入這個命令了)。另外也將默認緩衝區大小設置得儘可能大。
(2)set trimspool
on:假脫機輸出文本時,會去除文本行兩端的空格,而且行寬不定。如果設置爲OFF(默認設 置),假脫機輸出的文本行寬度則等於所設置的LINESIZE。
(3)set long 5000:設置選擇LONG 和CLOB 列時顯示的默認字節數
。
(4)set linesize 100:設置SQL*Plus 顯示的文本行寬爲100 個字符。
(5)set pagesize 9999:
PAGESIZE 可以控制SQL*Plus多久打印一次標題,這裏將PAGESIZE設置爲一個很大的數(所以每頁只有一組標題)。
(6)column plan_plus_exp format a80:
設置由AUTOTRACE 得到的解釋計劃輸出(explain planoutput)的默認寬度。a80 通常足以放下整個計劃。
(7)column global_name new_value gname
指令告訴SQL*Plus 取得GLOBAL_NAME列中的最後一個值,並將這個值賦給替換變量GNAME。
(8)select lower(user) || ‘@’ || substr( global_name, 1, decode( dot, 0,length(global_name), dot-1) ) global_name from (select global_name, instr(global_name,’.’) dot from global_name );
從數據庫中查出global_name(global_name=db_name.do_main)截取db_name與登錄的用戶名連接。得到sqlplus提示符爲:sys@ORCL> 這樣就知道用戶是誰,登錄的那個數據庫
1.3、解決小案例彙總
- sqlplus中執行存儲過程的DBMS_OUTPUT並沒有結果
set serveroutput on
- sqlplus中貼一些帶有空行的sql報語法錯誤
有空行導致sql語句加載到機器內存中截斷了,導致一堆報錯,說是無法識別到命令啥的,解決:
set sqlblanklines on
- 解決數字的顯示變成科學計數法,或者其它不識別格式
在查詢oracle scn是由於數字太長,顯示的結果變成了科學計數法,看着很不爽
用下面三種方法可以解決:
1、Set numw 20 輕鬆解決,默認值 show numw 是10 最大值是50
2、SQL> col colname format 99999.99
3、SQL>set numformat 999999999.999999999
附加:
PL/SQL中每行長度問題
set colwidth nnn
2、sqlplus如何優雅的輸出結果爲html文檔
參考資料:Data Collection - Script to Gather Oracle Text Index Information (Doc ID 1902197.1)
How to Create HTML with SQL*Plus (Doc ID 136207.1)
Example 6 in Note 136207.1 for HTML Output Generates > < instead of ‘<’ ‘>’ (Doc ID 239667.1)
Markup HTML Causes &, ", >, and < To Be Displayed As & " > and < (Doc ID 239424.1)
案例:
set markup html on entmap off spool on preformat off
set pages 400
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
spool out.html
select t.logtime ,
id,
case scount - dcount
when 0 then
to_char(scount - dcount)
else
'<font color=''red''>' || to_char((scount - dcount)) || '</font>'
end diff,
sowner ,
stable ,
scount ,
downer ,
dtable ,
dcount
from sys.t_check_log t
where logtime > trunc(sysdate)
order by id;
3、通過SQL*PLUS向shell傳遞變量
參考資料:http://www.eygle.com/archives/2005/04/eciosqlplusieos.html
案例參考一:
[oracle@jumper oracle]$ cat a.sh
sqlplus -S "/ as sysdba" << !
set heading off
col today noprint
column today new_val dat
select to_char( sysdate, 'yyyy-mm-dd') today from dual;
host echo 'today is ' &dat
exit;
exit;
!
執行結果:
[oracle@jumper oracle]$ ./a.sh
today is 2005-04-11
案例參考二:
itpub上的Toms_zhang朋友提供了另外一種方法:
[oracle@jumper oracle]$ more a.sh
#!/bin/ksh
VALUE=`sqlplus -silent "/ as sysdba" < < END
set pagesize 0 feedback off verify off heading off echo off
select max(sequence#) from v\\\$log_history;
exit;
END`
if [ -z "$VALUE" ]; then
echo "No rows returned from database"
exit 0
else
echo "Max Sequence Number: $VALUE"
fi
執行結果:
[oracle@jumper oracle]$ ./a.sh
Max Sequence Number: 17
4、sqlplus常用設置
- a.執行一個SQL腳本文件
SQL>start file_name
SQL>@ file_name
- b.將顯示的內容輸出到指定文件
SQL> SPOOL file_name
- c.關閉spool輸出
SQL>SPOOL OFF
只有關閉spool輸出,纔會在輸出文件中看到輸出的內容。
- d.改變列的顯示長度.
字符型改變:
SQL>col colname format a40
數值型改變:
SQL> col colname format 99999.99
- e.是否顯示腳本中正在執行的SQL語句.
SQL>SET ECHO {ON|OFF}
- f.是否顯示當前sql語句查詢或修改的行數.
SQL> SET FEED[BACK] {6|n|ON|OFF}
默認只有結果大於6行時才顯示結果的行數。如果set feedback 1,則不管查詢到多少行都返回。當爲off 時,一律不顯示查詢的行數
- g.是否顯示列標題
SQL> SET HEA[DING] {ON|OFF}
當set heading off 時,在每頁的上面不顯示列標題,而是以空白行代替
- h.設置一行可以容納的字符數
SQL> SET LIN[ESIZE] {80|n}
如果一行的輸出內容大於設置的一行可容納的字符數,則折行顯示。
- i.設置頁與頁之間的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
當set newpage 0 時,會在每頁的開頭有一個小的黑方框。
當set newpage n 時,會在頁和頁之間隔着n個空行。
當set newpage none 時,會在頁和頁之間沒有任何間隔。
- j.設置一頁有多少行數
SQL> SET PAGES[IZE] {24|n}
如果設爲0,則所有的輸出內容爲一頁並且不顯示列標題
- k.是否顯示用DBMS_OUTPUT.PUT_LINE包進行輸出的信息
SQL> SET SERVEROUT[PUT] {ON|OFF}
這個在shell腳本中經常使用,默認buffer是256個字節。
當輸出的大於256時,可以使用SET SERVEROUT on size 1000000;
最大buffer的緩衝區爲1000000(9i and 8i)。
- l.當SQL語句的長度大於LINESIZE時,是否在顯示時截取SQL語句
SQL> SET WRA[P] {ON|OFF}
當輸出的行的長度大於設置的行的長度時(用set linesize n命令設置),
當set wrap on時,輸出行的多於的字符會另起一行顯示,否則,
會將輸出行的多於字符切除,不予顯示。
- m.是否在屏幕上顯示輸出的內容,主要用與SPOOL結合使用
SQL> SET TERM[OUT] {ON|OFF}
在用spool命令將一個大表中的內容輸出到一個文件中時,
將內容輸出在屏幕上會耗費大量的時間,設置set termspool off後,
則輸出的內容只會保存在輸出文件中,不會顯示在屏幕上,
極大的提高了spool的速度。
- n.將SPOOL輸出中每行後面多餘的空格去掉
SQL> SET TRIMS[OUT] {ON|OFF}
- o.顯示每個sql語句花費的執行時間
SQL>set TIMING {ON|OFF}