入門第一步:最小可運行過程
-- 1. 創建骨架文件 skeleton.sql
CREATE OR REPLACE PROCEDURE skeleton IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!');
END;
/
-- 2. SQL*Plus執行
SQL> @skeleton
Procedure created.
-- 3. 關鍵:啟用輸出緩衝區
SQL> SET SERVEROUTPUT ON
-- 4. 執行驗證
SQL> EXEC skeleton;
Hello World!
PL/SQL procedure successfully completed.
標準調試循環
循環:
1. 編輯 .sql 文件 (Notepad/PLSQL Developer/VS Code)
2. SQL*Plus 執行 @文件名 → 編譯創建/替換
3. 觀察編譯錯誤 (SHOW ERRORS / 錯誤行號)
4. 執行 EXEC 過程名(參數) → 運行時錯誤/輸出
5. 根據錯誤/輸出修改代碼
6. 重複直到無錯誤、輸出符合預期
商業級開發調試進階技巧
1. 條件式調試輸出
CREATE OR REPLACE PROCEDURE debug_demo(p_id IN NUMBER) IS
v_debug BOOLEAN := TRUE; -- 生產環境改為FALSE或由配置表控制
BEGIN
IF v_debug THEN
DBMS_OUTPUT.PUT_LINE('DEBUG: Enter with p_id=' || p_id);
END IF;
-- 業務邏輯...
IF v_debug THEN
DBMS_OUTPUT.PUT_LINE('DEBUG: Exit');
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR: ' || SQLERRM);
RAISE;
END;
2. 自主事務記錄調試日志表
CREATE TABLE debug_log (
log_time TIMESTAMP DEFAULT SYSTIMESTAMP,
proc_name VARCHAR2(100),
step VARCHAR2(200),
msg VARCHAR2(4000)
);
CREATE OR REPLACE PROCEDURE log_debug(p_proc VARCHAR2, p_step VARCHAR2, p_msg VARCHAR2) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO debug_log(proc_name, step, msg) VALUES (p_proc, p_step, p_msg);
COMMIT;
END;
/
-- 業務過程中調用 log_debug('PROC_A', 'STEP_1', 'value='||v_val);
3. PL/SQL Developer / SQL Developer 圖形化調試
- 設置斷點(F9)、單步執行(F8)、觀察變量值、調用堆棧、修改變量運行時值。
- 支援遠程調試:數據庫服務器開啟
DEBUG_CONNECT_SESSION權限,客戶端附加進程。
4. 編譯期錯誤快速定位
-- 創建後立即查看錯誤
SHOW ERRORS PROCEDURE proc_name;
-- 或查詢視圖
SELECT line, text FROM user_errors WHERE name = 'PROC_NAME' ORDER BY sequence;
常見錯誤模式與對策
| 錯誤類型 | 典型現象 | 根因與對策 |
| PLS-00103 | Encountered symbol "X" when expecting "Y" | 語法錯誤:漏分號、關鍵字拼寫、結構不匹配 → 對照行號逐字核對 |
| ORA-06550 | line X, column Y: PL/SQL: Statement ignored | 運行時錯誤:空指釥、除零、類型不匹配 → 加入異常處理+DBMS_OUTPUT輸出變量值 |
| ORA-04068 | existing state of packages has been discarded | 會話級包狀態失效:重新編譯包體、重新連接會話 |
| ORA-01031 | insufficient privileges | 缺少系統/對象權限 → DBA授權GRANT EXECUTE ON ...或GRANT CREATE PROCEDURE |
最佳實踐檢查清單
- 所有過程強制包含
EXCEPTION WHEN OTHERS THEN ... RAISE;統一錯誤處理
- 調試輸出環境隔離:開發/測試開啟,生產關閉或寫日志表
- 參數模式明確:IN/OUT/IN OUT,避免隱式類型轉換
- 大數據量游標使用BULK COLLECT + FORALL減少上下文切換
- 代碼納入版本控制(Git),部署通過CI/CD流水線執行
@deploy.sql
- 定期運行
UTL_RECOMP.RECOMP_SERIAL重新編譯無效對象
調試心法:
• 「編譯錯誤看行號,運行錯誤看堆棧,邏輯錯誤加日志」
• 複雜邏輯先寫測試用例(測試數據+預期結果),再寫實現代碼(TDD思想)。
• 生產故障複現:導出相關表統計信息+綁定變量值 → 測試庫DBMS_SQLTUNE或手工構建調用重現。
• 避免在生產直接SET SERVEROUTPUT ON SIZE UNLIMITED大量輸出導致共享池壓力,改用自主事務寫日志表。