SQL*Plus 是 Oracle DBA/開發者的「瑞士軍刀」,掌握其環境設置、緩衝區編輯、腳本生成、輸出格式化、性能調試五大核心能力,能將日常操作效率提升 10 倍。本文匯總 68 個 SET 參數精華、編輯命令速查表、自動化腳本模板、調優專用設置。
| 分組 | 命令 | 默認值 | 說明與推薦值 |
|---|---|---|---|
| 輸出格式 | SET LINESIZE 1000 | 100 | 行寬,防換行截斷,建議 1000-32767 |
SET PAGESIZE 200 | 14 | 頁長,0=不分頁,建議 1000 或 0 | |
SET HEADING OFF | ON | 隱藏列標題,生成腳本/CSV 時關閉 | |
SET FEEDBACK OFF | ON (6行) | 隱藏「已選擇 N 行」反饋,腳本靜默執行 | |
SET TRIMSPOOL ON | OFF | 去除行尾空格,Spool 文件更乾淨 | |
SET TRIMOUT ON | OFF | 去除輸出行尾空格 | |
SET WRAP OFF | ON | 長行截斷不換行,配合 LINESIZE 使用 | |
SET COLSEP '|' | 單空格 | 列分隔符,生成 CSV 管道符 | |
| 性能調試 | SET TIMING ON | OFF | 顯示每條語句執行耗時(牆鐘時間) |
SET TIME ON | OFF | 顯示當前時間戳 | |
SET AUTOTRACE TRACEONLY EXPLAIN | OFF | 僅顯示執行計劃不執行,調優首選 | |
SET AUTOTRACE TRACEONLY STATISTICS | OFF | 執行並顯示統計(邏輯讀、物理讀、Redo 大小等) | |
SET AUTOTRACE ON | OFF | 執行+計劃+統計 | |
SET SQLPROMPT '_USER'@'_CONNECT_IDENTIFIER> ' | SQL> | 自定義提示符,顯示用戶@實例 | |
| 事務控制 | SET AUTOCOMMIT OFF | OFF | 關閉自動提交,手動控制事務邊界 |
SET AUTOCOMMIT ON | OFF | 每條 DML 自動提交(慎用) | |
SET AUTOCOMMIT 5 | OFF | 每 5 條 DML 自動提交(批量載入) | |
SET PAUSE ON | OFF | 分頁暫停,按 Enter 翻頁 | |
SET ESCAPE '\' | OFF | 轉義字符,處理 & 變量衝突 |
L[IST] [n|m n] -- 列出緩衝區全部/指定行,* 標記當前行
A[PPEND] text -- 在當前行末追加文本
C[HANGE] /old/new -- 當前行替換
C[HANGE] /text -- 當前行刪除文本
I[NPUT] [text] -- 當前行後插入新行
DEL [n|m n] -- 刪除當前行/指定行
RUN 或 / -- 執行緩衝區命令
SAVE filename [CRE[PLACE]|APP[END]] -- 保存緩衝區為 .sql
GET filename -- 載入 .sql 到緩衝區
START filename 或 @filename -- 執行腳本文件
@@filename -- 在腳本中調用另一腳本(相對路徑)
DEFINE var = 'value' -- 定義替換變量
UNDEFINE var -- 刪除變量
SELECT &var FROM dual; -- 使用 & 觸發替換
SELECT &&var FROM dual; -- 雙 & 只提示一次,複用值
ACCEPT var PROMPT 'Enter: ' -- 交互式輸入
COLUMN col NEW_VALUE var -- 查詢結果賦值給變量(報表常用)
SPOOL file.lst [CRE|APP|OFF] -- 開啟/關閉/追加輸出
-- 典型報表生成流程
SET HEADING OFF FEEDBACK OFF TRIMSPOOL ON LINESIZE 3000 PAGESIZE 0
SPOOL tables.csv
SELECT table_name || ',' || num_rows || ',' || blocks FROM user_tables;
SPOOL OFF
-- gen_grants.sql
SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON
SPOOL grants.sql
SELECT 'GRANT SELECT ON ' || table_name || ' TO app_readonly;'
FROM user_tables
WHERE table_name NOT LIKE 'TMP_%';
SPOOL OFF
@grants.sql
-- recompile_views.sql
SPOOL recompile.sql
SELECT 'ALTER VIEW ' || view_name || ' COMPILE;' FROM user_views;
SPOOL OFF
@recompile.sql
-- 會話級調優環境
ALTER SESSION SET STATISTICS_LEVEL = ALL;
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12'; -- 10046 追蹤
-- 或
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(waits=>TRUE, binds=>TRUE);
-- 執行目標 SQL
-- ...
-- 關閉追蹤
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE;
-- 用 TKPROF 分析
-- tkprof trace.trc output.txt sys=no sort=prsela,exeela,fchela
-- 登錄後自動執行 login.sql (放在 SQLPATH 目錄)
DEFINE _EDITOR = notepad++
SET SQLPROMPT '_USER'@'_CONNECT_IDENTIFIER> '
SET LINESIZE 200 PAGESIZE 1000 TRIMSPOOL ON TIMING ON
COLUMN plan_plus_exp FORMAT A100
-- 自定義函數:顯示表大小
CREATE OR REPLACE FUNCTION show_table_size(p_table VARCHAR2) RETURN VARCHAR2 AS
v_size NUMBER;
BEGIN
SELECT bytes/1024/1024 INTO v_size FROM user_segments WHERE segment_name = UPPER(p_table) AND segment_type = 'TABLE';
RETURN p_table || ': ' || ROUND(v_size,2) || ' MB';
END;
/
-- 使用
SELECT show_table_size('EMP') FROM dual;
SET LONG 1000000 查看 CLOB 完整內容(如 SQL_FULLTEXT、HIGH_VALUE)。SET NUMWIDTH 20 防止數字科學計數法顯示截斷。SET ESCAPE ON 避免 & 被誤識別為替換變量(如密碼含 &)。@script.sql 路徑含空格需加雙引號:@"D:\My Scripts\run.sql"。EXIT vs QUIT:EXIT 可帶返回碼(EXIT :SQL.SQLCODE),適合 Shell 判斷。將上述設置固化為個人 login.sql(放在 SQLPATH 環境變量指向的目錄),每次啟動 SQL*Plus 自動加載,打造專屬「高效調優工作台」。