SPOOL 命令將 SQL*Plus 會話輸出 (查詢結果、執行計劃、報錯信息) 重定向到操作系統文件,或直接發送到打印機。
SPOOL [file_name [CREATE | REPLACE | APPEND]] | OFF | OUT
| 選項 | 說明 |
|---|---|
file_name | 目標文件路徑 (含副檔名 .lst/.txt/.csv) |
CREATE | 創建新文件,文件存在則報錯 (默認行為) |
REPLACE | 覆蓋現有文件 (最常用) |
APPEND | 追加到文件末尾 |
OFF | 停止記錄,關閉文件句柄 |
OUT | 發送到打印機 (需 OS 打印隊列配置) |
SQL> SPOOL E:\query_result.lst REPLACE
SQL> SELECT * FROM dept;
SQL> SPOOL OFF
生成文件 E:\query_result.lst 內容:
SELECT * FROM dept
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
特點:文件包含 **執行的 SQL 語句 + 查詢結果**,便於審計與複現。
SQL> SPOOL E:\daily_report.lst APPEND
SQL> SELECT SYSDATE FROM dual;
SQL> SPOOL OFF
-- 多次執行,結果依次追加
SET LINESIZE 200
SET PAGESIZE 0
SET FEEDBACK OFF
SET HEADING OFF
SET TRIMSPOOL ON
SET COLSEP ','
SPOOL E:\dept_export.csv REPLACE
SELECT deptno, dname, loc FROM dept;
SPOOL OFF
生成無標題、CSV 格式,可直接導入 Excel/ETL 工具。
SET AUTOTRACE TRACEONLY EXPLAIN
SPOOL E:\plan.lst
SELECT * FROM emp WHERE deptno = 10;
SPOOL OFF
SPOOL "E:\My Reports\rpt.lst"SET TRIMSPOOL ON 去除行尾空格,減小文件體積。NLS_LANG 與客戶端編碼一致 (如 AMERICAN_AMERICA.ZHS16GBK 或 AL32UTF8),或用 SET MARKUP HTML ON 生成 HTML 避免編碼問題。SPOOL report_&_DATE._&_TIME..lst 利用 SQL*Plus 替換變量生成帶時間戳文件名。| 方式 | 執行端 | 適用場景 | 權限需求 |
|---|---|---|---|
| SPOOL | 客戶端 | 交互式導出、報表、腳本日志 | 客戶端寫權限 |
| UTL_FILE | 服務端 | PL/SQL 批量寫文件、定時任務 | DIRECTORY 對象權限 |
| EXTERNAL TABLE | 服務端 | 大數據量高性能導出 (ORACLE_DATAPUMP/LOADER) | DIRECTORY + CREATE TABLE |
SPOOL 是 SQL*Plus 最實用的輸出重定向命令,**記住 SPOOL OFF 關閉文件**,否則後續輸出會持續寫入導致文件暴漲。生產環境批量導出優先考慮服務端 UTL_FILE 或 Data Pump。