【SQL*Plus】SPOOL到檔案且在螢幕上列印SPOOL輸出資訊

secooler發表於2009-10-17
如果您經常在SQL*Plus中書寫指令碼,一定會遇到這樣一個場景:使用spool將“使用SQL生成SQL指令碼”的內容輸出到檔案過程中,不想在螢幕上看到輸出的SQL指令碼資訊,而直接可以呼叫生成的指令碼來執行。

如果上面的場景描述,您沒有明白是什麼意思,那麼請看我下面的真實需求演示。

1.資料庫日常維護中的一個具體需求
自動完成使用者下所有表的分析,執行過程中,螢幕上不顯示分析指令碼的具體內容,僅顯示最後分析語句的執行情況。

2.需求實現
$ cat analyze_user_table.sql
set head off
set feedback off
set linesize 131
set pagesize 0
set termout off
set trimspool on
SET TERMOUT OFF

spool generate_analyze_user_table.sql

SELECT 'analyze table ' || table_name
       || ' compute statistics for table for all indexes for all indexed columns;'
  FROM user_tables;

spool off

set feedback on
SET TERMOUT ON

@generate_analyze_user_table.sql

3.上面指令碼的使用方法
在SQL*Plus中使用“@”方式引用上面“
analyze_user_table.sql”指令碼,執行效果如下
sec@asd> @analyze_user_table.sql

Table analyzed.


Table analyzed.

...

4.指令碼分析說明
只有你真正的執行了上面的程式碼,你才能真正體會到其中的變化。
實現需求的的關鍵體現在“SET TERMOUT OFF”這條語句,該命令的目的是,在執行指令碼的過程中不屏顯輸出內容,但真實的完成指令碼的內容。
其他的set命令指示輔助輸出,使生成的指令碼更加的規範

Oracle官方文件中關於
SET TERMOUT的說明摘錄在此:
SET TERM[OUT] {ON | OFF}

SET TERMOUT is not supported in iSQL*Plus

Controls the display of output generated by commands in a script. that is executed with @, @@ or START. OFF suppresses the display so that you can spool output to a file without displaying the output on screen. ON displays the output on screen. TERMOUT OFF does not affect output from commands you enter interactively or redirect to SQL*Plus from the operating syste

連線:

5.使用
“SET TERMOUT OFF”的注意事項
從上面引用的文件描述中可以得到一個注意事項:只有在呼叫的指令碼中使用時,才能達到“屏不顯但輸出”的效果,如果直接在SQL*Plus中使用,這個引數是不生效的。
驗證方法:僅需將上面我編寫的小指令碼直接複製到SQL*Plus中執行便可得到驗證。

6.小結
關於SQL*Plus中的很多設定小技巧都非常有趣而且高效。
更多資訊可以參考Oracle的官方文件“SET System Variable Summary”


-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-616786/,如需轉載,請註明出處,否則將追究法律責任。

相關文章