SPOOL 是 SQL*Plus 客戶端命令,而非 SQL 語法。它將查詢結果重定向至操作系統文件,廣泛用於數據導出、報表生成、ETL 數據準備。
| 設置命令 | 作用 | 推薦值 |
|---|---|---|
| SET COLSEP | 列分隔符 | '|' 或 ',' |
| SET ECHO OFF | 不顯示腳本命令本身 | OFF |
| SET FEEDBACK OFF | 不顯示「已選擇 N 行」提示 | OFF |
| SET HEADING OFF | 不輸出列標題 | OFF |
| SET PAGESIZE 0 | 禁用分頁,避免重複標題 | 0 |
| SET TERMOUT OFF | 不在屏幕顯示輸出 | OFF |
| SET TRIMOUT ON | 去除標準輸出尾部空格 | ON |
| SET TRIMSPOOL ON | 去除 SPOOL 文件尾部空格 | ON |
| SET LINESIZE | 單行最大字符數,防截斷 | 2000+ |
| SET NEWPAGE NONE | 不打印換頁符 | NONE |
SET COLSEP '|'
SET TRIMSPOOL ON
SET LINESIZE 120
SET PAGESIZE 2000
SET NEWPAGE 1
SET HEADING OFF
SET TERMOUT OFF
SET NUMWIDTH 18
SET FEEDBACK OFF
SPOOL /path/file.txt
SELECT * FROM tablename;
SPOOL OFF
缺點: 大數據量下格式不穩定,字段含換行符時極易導致 SQL*Loader 導入失敗,文件體積膨脹。
SET TRIMSPOOL ON
SET LINESIZE 120
SET PAGESIZE 2000
SET NEWPAGE 1
SET HEADING OFF
SET TERMOUT OFF
SPOOL /path/file.txt
SELECT col1 || '|' || col2 || '|' || col3 || '|' || col4 FROM tablename;
SPOOL OFF
優勢: 格式完全可控,文件體積約為模式一的 1/4,SQL*Loader 導入成功率極高(>99%)。
#!/bin/sh
# spool_export.sh
DB_USER=zxdbm_ismp
DB_PWD=zxin_smap
DB_SERV=zx10_40_43_133
sqlplus -s $DB_USER/$DB_PWD@$DB_SERV << EOF
SET TRIMSPOOL ON
SET LINESIZE 2000
SET PAGESIZE 0
SET HEADING OFF
SET FEEDBACK OFF
SET TERMOUT OFF
SPOOL /data/export/ssrv_sendsms_task_$(date +%Y%m%d).txt
SELECT taskindex || '|' || commonindex || '|' || tasktype || '|' || TO_CHAR(SYSDATE, 'YYYYMMDD')
FROM ssrv_sendsms_task;
SPOOL OFF
EXIT
EOF
SET LONG 1000000 並配合 SET LONGCHUNKSIZE 防止截斷。ARRAYSIZE(如 5000)減少網絡往返。ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' 統一日期格式。總結: SPOOL 雖老但金,掌握「手工格式化 + 環境參數優化 + Shell 自動化」三板斧,即可構建穩健高效的 Oracle 數據導出管道。