SQL*Plus 核心概念
- SQL:ANSI 標準查詢語言,操作資料庫物件
- SQL*Plus:Oracle 專屬命令列工具,提供環境控制、報表格式化、腳本管理等擴充功能
- 關鍵差異:SQL 不可縮寫、可操作資料庫、命令存入緩衝區;SQL*Plus 可縮寫、不直接操作資料庫、命令不存入緩衝區
核心命令分類速查
| 類別 | 命令 (縮寫) | 功能 | 範例 |
| 緩衝區編輯 | EDIT (ED) | 開啟編輯器修改緩衝區 SQL | ED |
| RUN (R) | 執行緩衝區當前 SQL | R |
| SAVE | 存檔緩衝區至檔案 | SAVE c:\query.sql |
| GET | 載入檔案至緩衝區 | GET c:\query.sql |
| @ / START | 載入並執行腳本檔 | @c:\script.sql |
| LIST (L) | 顯示緩衝區內容 | L |
| CLEAR BUFFER | 清空緩衝區 | CLEAR BUFFER |
| DEL | 刪除緩衝區指定行 | DEL 3 |
| 連線控制 | CONNECT (CONN) | 連線/切換用戶 | CONN user/pass@tns |
| DISCONNECT (DISC) | 中斷連線不離開 SQL*Plus | DISC |
| EXIT / QUIT | 離開 SQL*Plus | EXIT |
| SHOW USER | 顯示當前用戶 | SHOW USER |
| PASSWORD | 修改密碼 | PASSWORD |
| 結構查詢 | DESCRIBE (DESC) | 顯示表/檢視/函數結構 | DESC employees |
| SHOW ALL | 顯示所有環境設定 | SHOW ALL |
| SHOW PARAMETERS | 顯示初始化參數 | SHOW PARAMETERS sga |
| SHOW RECYCLEBIN | 顯示回收筒 | SHOW RECYCLEBIN |
環境變數設定 (SET/SHOW)
| 設定命令 | 說明 | 常用值/範例 |
SET AUTOCOMMIT {ON|OFF|IMMEDIATE|n} | 自動提交控制 | SET AUTOCOMMIT OFF (手動 COMMIT) |
SET LINESIZE {n} | 顯示行寬度 | SET LINESIZE 200 (預設 80/150) |
SET PAGESIZE {n} | 每頁列數 (0=不分頁) | SET PAGESIZE 50 |
SET LONG {n} | LONG/CLOB 顯示長度 | SET LONG 10000 |
SET LONGCHUNKSIZE {n} | LONG 分塊輸出大小 | SET LONGCHUNKSIZE 1000 |
SET TRIMSPOOL {ON|OFF} | SPOOL 輸出去除尾部空白 | SET TRIMSPOOL ON |
SET TRIMOUT {ON|OFF} | 螢幕輸出去除尾部空白 | SET TRIMOUT ON |
SET TIMING {ON|OFF} | 顯示執行耗時 | SET TIMING ON |
SET TIME {ON|OFF} | 提示符顯示當前時間 | SET TIME ON |
SET FEEDBACK {ON|OFF|n} | 顯示「n 筆資料已選取」 | SET FEEDBACK OFF |
SET HEADING {ON|OFF} | 顯示欄位標題 | SET HEADING OFF (匯出資料用) |
SET VERIFY {ON|OFF} | 顯示替換變數前後值 | SET VERIFY OFF |
SET DEFINE {ON|OFF|c} | 替換變數前綴字元 | SET DEFINE OFF (避免 & 衝突) |
SET SERVEROUTPUT {ON|OFF} SIZE n | 啟用 DBMS_OUTPUT | SET SERVEROUTPUT ON SIZE 1000000 |
SET NUMFORMAT "format" | 數字顯示格式 | SET NUMFORMAT "999,999.99" |
SET COLSEP "sep" | 欄位分隔符 (SPOOL 用) | SET COLSEP "," |
SET MARKUP HTML ON | 輸出 HTML 表格 | SET MARKUP HTML ON SPOOL ON |
輸出重導向與報表產生
SPOOL 命令
SPOOL c:\output\report.txt -- 開始記錄 (覆蓋)
SPOOL c:\output\report.txt APPEND -- 附加模式
SPOOL c:\output\report.html -- 搭配 MARKUP HTML
...
SPOOL OFF -- 結束記錄
完整報表腳本範例
SET LINESIZE 200 PAGESIZE 50 TRIMSPOOL ON TRIMOUT ON
SET FEEDBACK OFF HEADING ON VERIFY OFF
SET COLSEP ',' MARKUP HTML ON SPOOL ON
SPOOL c:\reports\dept_sal_&_DATE..html
BREAK ON DEPARTMENT_NAME SKIP 1
COMPUTE SUM LABEL '部門總薪' OF SALARY ON DEPARTMENT_NAME
COMPUTE SUM LABEL '公司總薪' OF SALARY ON REPORT
SELECT d.DEPARTMENT_NAME, e.FIRST_NAME || ' ' || e.LAST_NAME AS EMP_NAME,
e.SALARY
FROM EMPLOYEES e JOIN DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_NAME, e.SALARY DESC;
SPOOL OFF
SET MARKUP HTML OFF
替換變數與腳本參數化
-- 定義變數
DEFINE dept_id = 10
DEFINE start_date = '2024-01-01'
-- 腳本參數 (&1, &2... 對應呼叫時傳入)
-- 查詢腳本 query_dept.sql:
SELECT * FROM employees WHERE department_id = &1 AND hire_date > '&2';
-- 執行
@query_dept.sql 10 '2024-01-01'
-- ACCEPT 互動式輸入
ACCEPT p_dept PROMPT '請輸入部門編號: ' NUMBER
SELECT * FROM employees WHERE department_id = &p_dept;
常用格式化命令 (COLUMN / FORMAT)
COLUMN salary FORMAT 999,999.99 HEADING '月薪'
COLUMN hire_date FORMAT A12 HEADING '到職日'
COLUMN email FORMAT A30 TRUNCATE
COLUMN commission_pct FORMAT 0.99 HEADING '提成%' NULL '(無)'
-- 清除格式
CLEAR COLUMNS
實用技巧與最佳實踐
- login.sql / glogin.sql:每次啟動自動執行,預設設定 LINESIZE、PAGESIZE、DATE FORMAT、EDITOR 等
- SET SQLPROMPT:自訂提示符,如
SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER> "
- SET EDITOR:指定外部編輯器
SET EDITOR "notepad++" 或 "code --wait"
- DESC 進階:
DESC table_name PARTITION 顯示分區資訊,DESC function_name 顯示函數簽名
- 避免 & 衝突:執行含 & 字元腳本前先
SET DEFINE OFF,結束後 SET DEFINE ON
- 大量資料匯出:
SET HEADING OFF FEEDBACK OFF TRIMSPOOL ON PAGESIZE 0 搭配 SPOOL 產生純資料檔
- 錯誤處理:
WHENEVER SQLERROR EXIT SQL.SQLCODE / WHENEVER OSERROR EXIT FAILURE 讓腳本失敗時回傳非零代碼,利於 CI/CD 整合
常見問題快速解決
| 問題 | 解決方案 |
| 輸出截斷/換行亂掉 | SET LINESIZE 32767 TRIMSPOOL ON TRIMOUT ON |
| 中文亂碼 | 確認 NLS_LANG 環境變數、終端機編碼、SET MARKUP HTML ON 指定 charset |
| DBMS_OUTPUT 無輸出 | SET SERVEROUTPUT ON SIZE UNLIMITED |
| 腳本執行卡住 | 檢查是否缺少分號/斜線 /、未結束引號、等待鎖定 |
| 變數替換錯誤 | SET DEFINE OFF 或使用 SET ESCAPE \ |