Oracle sqlplus使用總結

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 &gt &lt 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}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章