SQL*Plus 是 Oracle 最高頻使用的命令列工具,但其輸出格式預設多為人眼閱讀設計,直接導出給程式處理常遭遇欄位對齊、分頁符、標題行、回饋訊息干擾。本文系統整理 SET 格式化參數、SPOOL 導出最佳實踐、自動化導出腳本範例,讓輸出乾淨、可解析、可直餵 ETL/報表。
| 命令 | 預設值 | 建議導出值 | 作用 |
|---|---|---|---|
SET COLSEP '|' | 單空格 | '|' 或 ',' | 欄位分隔符,便於 CSV/程式解析 |
SET NEWPAGE NONE | 1 (每頁空一行) | NONE | 取消分頁空行,輸出連續行 |
SET ECHO OFF | ON | OFF | 不顯示腳本內 SQL 命令本身 |
SET FEEDBACK OFF | ON (6 行以上顯示) | OFF | 隱藏 "已選擇 N 行" 訊息 |
SET HEADING OFF | ON | OFF | 隱藏欄位標題行,純數據 |
SET PAGESIZE 0 | 24 | 0 | 禁用分頁,無標題重複、無換頁符 |
SET LINESIZE 1000 | 80/150 | 足夠大 (如 1000/32767) | 防止長行截斷換行 |
SET NUMWIDTH 15 | 10 | 依精度調整 | 數值欄位顯示寬度 |
SET TERMOUT OFF | ON | OFF (SPOOL 時) | 不在終端顯示輸出,加速導出 |
SET TRIMOUT ON | OFF | ON | 去除標準輸出行尾空格 |
SET TRIMSPOOL ON | OFF | ON | 去除 SPOOL 檔案行尾空格 (關鍵) |
SET SERVEROUTPUT ON | OFF | ON | 啟用 DBMS_OUTPUT 顯示 |
SET TIMING ON | OFF | 視需求 | 顯示語句執行耗時 |
SET AUTOTRACE ON | OFF | 調優時 | 顯示執行計畫與統計 |
SET VERIFY OFF | ON | OFF | 關閉新舊值確認提示 (含替換變數時) |
SET HEADSEP OFF | ON (|) | OFF | 禁用標題分隔符換行 |
SET SQLBLANKLINES OFF | OFF | OFF | 不保留 SQL 空行 |
SET HEAD OFF
SET HEADSEP OFF
SET NEWPAGE NONE
SET LINESIZE 1000
SET PAGESIZE 0
SET SQLBLANKLINES OFF
SET TRIMSPOOL ON
SET TERMOUT OFF
SET FEEDBACK OFF
SET COLSEP '&' -- 欄位分隔符用 & (URL 安全) 或 |、,
SPOOL d:\export.txt
SELECT nodecode || '&' || nodetype || '&' || nodename || '&'
FROM "000".tbnode;
SPOOL OFF
EXIT
執行方式: sqlplus /nolog @d:\sp.sql (Windows) 或 sqlplus -s /nolog @sp.sql (Linux, -s 靜默模式進一步抑制 Banner)。
USER_TABLES,拼接每表 SELECT ... + SPOOL,實現全 Schema 自動導出。SELECT 大物件會截斷/亂碼。需用 PL/SQL 迴圈 DBMS_LOB.SUBSTR 分塊輸出,或改用 Python/cx_Oracle、Java/JDBC、Data Pump 導出。NLS_LANG 需與資料庫字符集匹配 (如 AMERICAN_AMERICA.ZHS16GBK 或 .AL32UTF8),避免中文亂碼。expdp/impdp 並行、壓縮、網路模式、細粒度過濾全面優於 SQL*Plus 文本導出。| 現象 | 原因 | 修正 |
|---|---|---|
| 輸出含 "已選擇 1000 行" | SET FEEDBACK OFF | |
| 每 24 行重複標題 | PAGESIZE 24 | SET PAGESIZE 0 |
| 行尾大量空格 | TRIMSPOOL OFF | SET TRIMSPOOL ON |
| 長行截斷換行 | LINESIZE 過小 | SET LINESIZE 32767 |
| 欄位擠在一起 | COLSEP 為空格 | SET COLSEP '|' |
| 中文亂碼 | NLS_LANG 不匹配 | 設置正確 NLS_LANG |
SQL*Plus 格式化輸出,核心在於 關閉所有「人眼友好」預設 (標題、分頁、回饋、驗證)、開啟所有「機器友好」屬性 (無分頁、無空格、固定分隔符、大行寬)。將上述 SET 組合封裝為標準腳本模板,納入團隊規範,所有導出任務一致、乾淨、可靠,不再為格式清洗浪費工程師寶貴時間。