一、各種設置參數解釋
轉自http://baike.baidu.com/view/1239908.htm
Sql*plus是一個最常用的工具,具有很強的功能,主要有:
  1. 數據庫的維護,如啟動,關閉等,這一般在服務器上操作。
   2. 執行sql語句執行pl/sql。
   3. 執行sql腳本。
   4. 數據的導出,報表。
   5. 應用程序開發、測試sql/plsql。
   6. 生成新的sql腳本。
   7. 供應用程序調用,如安裝程序中進行腳本的安裝。
   8. 用戶管理及權限維護等。
二、下面就介紹一下一些常用的sql*plus命令:
   1. 執行一個SQL腳本文件
   SQL>start file_name
   SQL>@ file_name
   我們可以將多條sql語句保存在一個文本文件中,這樣當要執行這個文件中的所有的sql語句時,用上面的任一命令即可,這類似於dos中的批處理。
   @與@@的區別是什么?
   @等於start命令,用來運行一個sql腳本文件。
   @命令調用當前目錄下的,或指定全路徑,或可以通過SQLPATH環境變量搜尋到的腳本文件。該命令使用是一般要指定要執行的文件的全路徑,否則從缺省路徑(可用SQLPATH變量指定)下讀取指定的文件。
   @@用在sql腳本文件中,用來說明用@@執行的sql腳本文件與@@所在的文件在同一目錄下,而不用指定要執行sql腳本文件的全路徑,也不是從SQLPATH環境變量指定的路徑中尋找sql腳本文件,該命令一般用在腳本文件中。
   如:在c:\temp目錄下有文件start.sql和nest_start.sql,start.sql腳本文件的內容為:
   @@nest_start.sql - - 相當於@ c:\temp\nest_start.sql
   則我們在sql*plus中,這樣執行:
   SQL> @ c:\temp\start.sql
附注:也可以在shell中運行,例如sqlplus '/as sysdba' @C:\temp\start.sql
         2. 對當前的輸入進行編輯
   SQL>edit
   3. 重新運行上一次運行的sql語句
   SQL>/
   4. 將顯示的內容輸出到指定文件
   SQL> SPOOL file_name
   在屏幕上的所有內容都包含在該文件中,包括你輸入的sql語句。
   5. 關閉spool輸出
   SQL> SPOOL OFF
   只有關閉spool輸出,才會在輸出文件中看到輸出的內容。
   6.顯示一個表的結構
   SQL> desc table_name
      1). 設置當前session是否對修改的數據進行自動提交("[ ...]"表示可省略)
   SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
   2).在用start命令執行一個sql腳本時,是否顯示腳本中正在執行的SQL語句
   SQL> SET ECHO {ON|OFF}
   3).是否顯示當前sql語句查詢或修改的行數
   SQL> SET FEED[BACK] {6|n|ON|OFF}
   默認只有結果大於6行時才顯示結果的行數。如果set feedback 1 ,則不管查詢到多少行都返回。當為off 時,一律不顯示查詢的行數
   4).是否顯示列標題
   SQL> SET HEA[DING] {ON|OFF}
   當set heading off 時,在每頁的上面不顯示列標題,而是以空白行代替
   5).設置一行可以容納的字符數
   SQL> SET LIN[ESIZE] {80|n}
   如果一行的輸出內容大於設置的一行可容納的字符數,則折行顯示。
     6).設置頁與頁之間的分隔
   SQL> SET NEWP[AGE] {1|n|NONE}
   當set newpage 0 時,會在每頁的開頭有一個小的黑方框。
   當set newpage n 時,會在頁和頁之間隔着n個空行。
   當set newpage none 時,會在頁和頁之間沒有任何間隔。
   7).顯示時,用text值代替NULL值
   SQL> SET NULL text
   8).設置一頁有多少行數
   SQL> SET PAGES[IZE] {24|n}
   如果設為0,則所有的輸出內容為一頁並且不顯示列標題
   9).是否顯示用DBMS_OUTPUT.PUT_LINE包進行輸出的信息。
   SQL> SET SERVEROUT[PUT] {ON|OFF}
   在編寫存儲過程時,我們有時會用dbms_output.put_line將必要的信息輸出,以便對存儲過程進行調試,只有將serveroutput變量設為on后,信息才能顯示在屏幕上。
   10).當SQL語句的長度大於LINESIZE時,是否在顯示時截取SQL語句。
   SQL> SET WRA[P] {ON|OFF}
   當輸出的行的長度大於設置的行的長度時(用set linesize n命令設置),當set wrap on時,輸出行的多於的字符會另起一行顯示,否則,會將輸出行的多於字符切除,不予顯示。(默認為on狀態)
   11).是否在屏幕上顯示輸出的內容,主要用與SPOOL結合使用。
   SQL> SET TERM[OUT] {ON|OFF}
   在用spool命令將一個大表中的內容輸出到一個文件中時,將內容輸出在屏幕上會耗費大量的時間,設置set termspool off后,則輸出的內容只會保存在輸出文件中,不會顯示在屏幕上,極大的提高了spool的速度。
   12).將SPOOL輸出中每行后面多余的空格去掉
   SQL> SET TRIMS[OUT] {ON|OFF}
   13)顯示每個sql語句花費的執行時間
   set TIMING {ON|OFF}
   14). 遇到空行時不認為語句已經結束,從后續行接着讀入。
   SET SQLBLANKLINES ON
   Sql*plus中, 不允許sql語句中間有空行, 這在從其它地方拷貝腳本到sql*plus中執行時很麻煩. 比如下面的腳本:
   select deptno, empno, ename
   from emp
   where empno = '7788';
   如果拷貝到sql*plus中執行, 就會出現錯誤。這個命令可以解決該問題
   15).設置DBMS_OUTPUT的輸出(只是用來在終端輸出用)
   SET SERVEROUTPUT ON BUFFER 20000
   用dbms_output.put_line('strin_content');可以在存儲過程中輸出信息,對存儲過程進行調試
   如果想讓dbms_output.put_line(' abc');的輸出顯示為:
   SQL> abc,而不是SQL>abc,則在SET SERVEROUTPUT ON后加format wrapped參數。
   16). 輸出的數據為html格式
   set markup html
   在8.1.7版本(也許是816? 不太確定)以后, sql*plus中有一個set markup html的命令, 可以將sql*plus的輸出以html格式展現.
   注意其中的spool on, 當在屏幕上輸出的時候, 我們看不出與不加spool on有什么區別, 但是當我們使用spool filename 輸出到文件的時候, 會看到spool文件中出現了等tag.
3.修改頁面顯示和行的默認值
但是這種方法,在你下次進入Sql Plus的時候還要重新設定,很麻煩。所以可以修改默認設置。
在Oracle的安裝目錄下找到glogin.sql,
我安裝的是Oracle 11,這個文件在D:\oracle\product\11.2.0\dbhome_1\sqlplus\admin下,用搜索很容易找到。然后打開這個文件,
得到:
--
-- Copyright (c) 1988, 2005, Oracle. All Rights Reserved.
--
-- NAME
-- glogin.sql
--
-- DESCRIPTION
-- SQL*Plus global login "site profile" file
--
-- Add any SQL*Plus commands here that are to be executed when a
-- user starts SQL*Plus, or uses the SQL*Plus CONNECT command.
set linesize 300 ;
set pagesize 100 ;
更多詳細內容參見:http://blog.csdn.net/kkdelta/article/details/7178890
      4.對於clob和blob以及to_char和to_clob之間的討論 
(1)clob和blob介紹
- BLOB全稱為二進制大型對象(Binary Large Object)。它用於存儲數據庫中的大型二進制對象。可存儲的最大大小為4G字節
 - CLOB CLOB全稱為字符大型對象(Character Large Object)。它與LONG數據類型類似,只不過CLOB用於存儲數據庫中的大型單字節字符數據塊,不支持寬度不等的字符集。可存儲的最大大小為4G字節。
 - NCLOB 基於國家語言字符集的NCLOB數據類型用於存儲數據庫中的固定寬度單字節或多字節字符的大型數據塊,不支持寬度不等的字符集。可存儲的最大大小為4G字節
 - BFILE 當大型二進制對象的大小大與4G字節時,BFILE數據類型用於將其存儲在數據庫外的操作系統文件中;當其大小不足4G字節時,則將其存儲在數據庫內部的操作系統文件中,BFILE列存儲文件定位程序,此定位程序指向服務器上的大型二進制文件。
 - 總結就是:Blob是存大對象類型(一般是文件 圖片,office文件等.) Clob是存大文本/長字符串
 
(2)實際項目中遇到的問題
在sqlplus中查詢clob類型的數據默認是不能顯示全的,默認一行顯示80個字符(多的會切割掉),不管是否設置set linesize 什么的,這是對clob的限制,例如:
select sql_fulltext from v$sql;就會發現每行只能顯示80個字符。
有幾種辦法顯示全:
方法一:select dbms_lob.substr(sql_fulltext) from v$sql;
     #注意,這樣雖然顯示全了,但是在后面還是會出問題,雖然這次不切割了,會在最后提示錯誤:ERROR: ORA-06502: PL/SQL: 數字或值錯誤 :  字符串緩沖區太小
      ORA-06512: 在 line 1
所以實際上沒有解決。哈哈哈哈
方法二:其實是可以設置參數解決上面的錯誤
SQLPLUS輸出CLOB類型的數據時經常會碰到數據被截斷從而無法完全輸出的問題,其實這些都是因為sqlplus參數設置的原因,本文將對幾個主要的參數進行討論。
1、set long 2000000000
首先是long參數,該參數的最大值是2000000000(2G),單位是字節。含義是:Sets maximum width (in bytes) for displaying CLOB, LONG, NCLOB and XMLType values; and for copying LONG values.中文含義大概是設置CLOB、LONG、NLOB和XMLType類型的最大顯示字節數。
2、set longchunksize 255
與long參數相關的是longchunksize參數,該參數的值應該比long參數的值要小,單位也是字節。含義是:Sets the size (in bytes) of the increments SQL*Plus uses to retrieve a CLOB, LONG, NCLOB or XMLType value.即sqlplus會按照這個參數的值來一段一段的獲取上述類型的數據,直到達到long的值或者數據獲取完畢。
舉例:
數據有10個字節:0123456789
如果set longchunksize 2,那么顯示出來的效果就是
01
23
45
67
89
如果set longchunksize 4,那么顯示出來的效果就是
0123
4567
89
3、set linesize 255
這個參數用的很頻繁,相信含義大家也都知道:Sets the total number of characters that SQL*Plus displays on one line before beginning a new line.這個參數是用來控制sqlplus顯示的,而longchunksize是用來控制sqlplus獲取數據的,所以如果這個參數設置不當也不能完全顯示。
舉例:
數據有10個字節:0123456789
set longchunksize 4
set linesize 3
顯示效果如下
012 --3無法顯示
456 --7無法顯示
89
所以想正確顯示select sql_fulltext from v$sql; 的方法就是設置set long 2000000000,真的最大2G,換其他的還真不行,嘻嘻。set longchunksize 255。
然后就可以正常查詢了,注意不要用dbms_lob.substr了哦,直接select sql_fulltext from v$sql;就可以啦
方法三:編寫程序(反正我是沒看懂)
給你一個我寫的讀lob的plsql作為參考:
 create or replace procedure haozhu_getblob(
 table_name in varchar2,
 field_id in varchar2,
 field_name in varchar2,
 v_id in varchar2,
 v_pos in number
 )
 is
 lobloc clob;
 buffer varchar2(32767);
 amount number := 60;
 offset number := 1;
 query_str varchar2(1000);
 create_str varchar2(1000);
 bloblength number;
 ddlcursor integer;
 begin
 query_str :='select DBMS_LOB.GETLENGTH('||field_name||') from '||table_name||' where '||field_id||'= :id';
 --dbms_output.put_line('query_str is '||query_str);
 EXECUTE IMMEDIATE query_str INTO bloblength USING v_id;
 --dbms_output.put_line('The length of blob is '||bloblength);
 query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id';
 EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
 offset:=offset+(v_pos-1)*amount;
 while (offset<=bloblength) loop
 --dbms_output.put_line('offset: '||offset);
 --read 2000 varchar2 from the buffer
 dbms_lob.read(lobloc,amount,offset,buffer);
 dbms_output.put_line(buffer);
 offset:=offset+amount;
 end loop;
 end;
 /
O(∩_∩)O哈哈~,這篇完,后面還會用到跟clob相關的內容,當時糾結死了
