在SQL*Plus中可以對作業系統中的文字檔進行簡單的讀寫訪問。
例如,事先將SQL語句或者PL/SQL塊的代碼存放在文字檔中,再把文字檔調入緩衝區中,使之執行。
或者把當前緩衝區中的內容儲存到一個檔案中, 或者把SQL語句、PL/SQL塊的執行結果儲存到檔案中。
1.讀檔案涉及的命令包括@、get、start等命令。
1.1 @命令的作用是將指定的文字檔的內容讀到緩衝區中,並執行它。文字檔可以是本地檔案,也可以是遠程伺服器上的檔案。
如果是本地檔案,@命令的命令的執行格式為:@檔案名稱
這裡的檔案名稱要指定完整的路徑,預設的副檔名是.sql,如果指令檔使用了預設的副檔名,則在@命令中可以省略副檔名。
如果是遠程檔案,必須將它存放到一個web伺服器上,並以HTTP或FTP方式訪問。這時@命令的命令的執行格式為(以HTTP為例):@http://web伺服器/檔案名稱
使用@命令讀取檔案時,檔案中可以包含多條SQL語句,每條語句以分號結束;或者可以包含一個PL/SQL塊。
檔案被讀入緩衝區中以後,SQL*Plus將按順序執行檔案中的代碼,並將執行結果輸出到顯示器上。
例如,假設在/home/Oracle目錄下有一個檔案,名為a.sql,檔案的內容為:
SELECT ename FROM emp WHERE empno=7902; SELECT dname FROM dept WHERE deptno=10;
現在希望通過@命令將這個檔案讀到緩衝區中,命令執行的執行格式如下:SQL> @/home/oracle /a
@命令還有一個用法,就是在啟動SQL*Plus的同時,將指定的檔案讀入緩衝區並執行它。
這時@命令和檔案名稱一起作為SQL*Plus的命令列參數,格式如下:sqlplus 使用者名稱/口令 @檔案名稱
注意,這種格式與以前提到的使用網路服務的格式是很相似的,
sqlplus 使用者名稱/口令 @檔案名稱
sqlplus 使用者名稱/口令@網路服務名
但是仍然有區別,請注意觀察:
sqlplus 使用者名稱/口令@網路服務名 由於檔案名稱和網路服務名都表現為字串,所以單純從名字上無法區分到底使用了檔案名稱還是網路服務名。
二者的區別在於第一種格式中在使用者名稱/口令之後有一個空格,這時將把後面的參數解釋為一個檔案,並把這個檔案載入到緩衝區中。
在第二種格式中,使用者名稱/口令之後沒有空格,這時將後面的參數解釋為網路服務名。
1.2 get命令的作用與@命令相似,但是它只是把檔案載入到緩衝區中,並不直接執行。
get命令的的執行格式為:get 檔案名稱 選項
其中檔案名稱的預設副檔名為.sql,在get命令中可以省略。目前get命令只支援本地的作業系統檔案。
可以使用的選項有兩個:LIST和NOLIST。
其中LIST選項指定將檔案的內容讀到緩衝區的同時,還要在顯示器上輸出,這是預設選項。
選項NOLIST使得檔案的內容不在顯示器上輸出。
使用get命令時還要注意,在文字檔中只能包含一條SQL語句,而且不能以分號結束。也可以只包含一個PL/SQL塊,塊以分號結束。
在使用@和get命令時要注意這些格式上的差別。例如,假設在/home/oracle目錄下有一個檔案,名為b.sql,檔案的內容為:
SELECT ename FROM emp WHERE empno=7902 現在先通過get命令把它讀入緩衝區,然後執行/命令使之執行:
SQL> get /home/oracle/b 1* SELECT ename FROM emp WHERE empno=7902 SQL> / ENAME ---------- FORD
1.3 start命令與@命令是等價的,這裡不再贅述。
2.寫檔案涉及的命令包括save和spool。
其中save命令用於將當前緩衝區中的內容寫入一個作業系統檔案,而spool命令用於將命令的執行結果輸出到一個作業系統檔案。
2.1 save命令的格式為:SQL>save 檔案名稱 選項
其中選項指定以什麼樣的方式寫檔案。可以使用的選項有以下三個:
CREATE 如果檔案不存在,則建立。否則,命令執行失敗。
APPEND 如果檔案不存在,則建立。否則,在檔案末尾追加。
REPLACE 如果檔案不存在,則建立。否則刪除原檔案,重新建立。
如果不指定完整的路徑,則在目前的目錄下產生這個檔案,檔案的預設副檔名是.sql。
例如,假設當前緩衝區中有一條SELECT語句,使用save命令可以將這條語句寫入檔案:
SQL> list 1* SELECT * FROM emp
SQL> save /home/oracle/aa
2.2 spool命令利用假離線技術,用於將SQL*Plus的輸出寫入到檔案中,它有以下幾種用法:
spool 得到當前spool的狀態,預設為不可用。
spool 檔案名稱 啟動spool,並開啟指定的檔案。
spool off 關閉spool,並將SQL*Plus的輸出寫入檔案中。
spool out 關閉spool,將SQL*Plus的輸出寫入檔案中,並同時送往印表機。
如果在SQL*Plus中以命令列的方式執行spool命令,那麼從執行spool命令並開啟檔案開始,此後的所有輸出,包括錯誤資訊,以及使用者的鍵盤輸入,都將寫入指定的檔案,直到遇到“spool off”或者“spool out”。
但是這些資訊的寫入是一次性完成,即在執行“spool off”或者“spool out”的一瞬間,這些資訊才一次全部寫入檔案,包括最後執行的“spool off”或者“spool out”命令本身。
檔案的預設副檔名為.LST,預設的路徑是目前的目錄。
spool命令通常的用法是產生報表。
首先將精心設計的SQL語句存放在一個檔案中,在產生輸出的語句前後加上spool命令,然後將這個檔案讀到緩衝區中執行。
這樣在寫入的檔案中只有命令執行的結果,而不包括SQL語句本身。
例如,假設目前的目錄下有一個檔案,名為c.sql,它的內容為:
spool cc SELECT ename,sal FROM emp WHERE deptno=10; spool off 現在將這個檔案讀到緩衝區中,並使之執行,執行結果如下:
SQL> @c
ENAME SAL CLARK 2450 KING 5000 MILLER 1300
檔案中SQL語句的執行結果顯示在螢幕上,同時在目前的目錄下產生了檔案cc.LST,檔案的內容與螢幕上顯示的結果完全一致。
exp:
SQL> get c:/temp/6-data ; 將檔案讀到緩衝區
SQL> save c:/temp/1.sql; 將緩衝區內容儲存到檔案
SQL> @install.sql; 執行檔案
sqlplusw ies/ies2010@orcl @install.sql (run.bat) 啟動SQL*Plus,並執行檔案
spool insert_sql.log; 將執行結果輸出到檔案
...
spool off;
Regex
^.*rows selected$
^.*rows inserted$