DB2 強大的 SQL PL (SQL Procedural Language) 讓開發人員能建立高效、穩定的儲存程序。本文針對具備基礎經驗的開發者,總結初始化參數、游標、異常處理、暫存表使用、非法程序重綁定等五大核心領域的最佳實踐,附完整範例代碼可直接套用。
雖然語法上非強制,但建議在建立陳述式中明確指定以下參數,提升執行效能與可維護性:
LANGUAGE SQL:宣告為 SQL 語言程序。DETERMINISTIC / NOT DETERMINISTIC:相同輸入是否保證相同輸出,影響優化器快取決策。READS SQL DATA / MODIFIES SQL DATA / CONTAINS SQL:精確描述資料存取分類,決定能否在函數/觸發器中調用。SPECIFIC <名稱>:提供唯一特定名稱,支援多載與精確權限管理。DYNAMIC RESULT SETS <N>:宣告回傳結果集數量,供呼叫端 (JDBC/ODBC/CLI) 擷取。DECLARE c1 CURSOR FOR SELECT ...;需更新時加 FOR UPDATE OF col1, col2。FETCH FIRST n ROWS ONLY 配合 OFFSET 或鍵值分頁,避免一次性物化巨大結果集。CLOSE c1; 於邏輯結束處顯式關閉,釋放鎖與資源。DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- 記錄錯誤資訊
INSERT INTO error_log(proc_name, sqlcode, sqlstate, err_msg, ts)
VALUES ('MY_PROC', SQLCODE, SQLSTATE, 'Custom context', CURRENT TIMESTAMP);
-- 視業務決定 RESIGNAL 或回傳自定義狀態
RESIGNAL; -- 向呼叫端拋出原始錯誤
END;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET v_done = 1; -- 控制迴圈結束
原則:EXIT HANDLER 處理嚴重錯誤並記錄/重拋,CONTINUE HANDLER 處理預期情況 (如 NOT FOUND) 讓流程繼續。
DECLARE GLOBAL TEMPORARY TABLE SESSION.tmp_x ... 儲存中間結果,避免永久表鎖爭用與日誌開銷。ON COMMIT PRESERVE ROWS 跨交易保留資料 (需在 USER TEMP TABLESPACE 建立)。DROP TABLE SESSION.tmp_x 或依賴連線結束自動清理。DDL 變更 (如索引刪除、表結構修改) 會導致相依儲存程序標記為非法 (INVALID)。定期執行:
SELECT ROUTINENAME, ROUTINESCHEMA
FROM SYSCAT.ROUTINES
WHERE ROUTINETYPE = 'P' AND VALID = 'N';
對查出的程序執行 REBIND_ROUTINE_PACKAGE 或重新 CALL SYSPROC.REBIND_ROUTINE_PACKAGE('P', 'schema.proc', 'ANY') 恢復有效狀態,防止運行時首次呼叫觸發隱性重綁導致延遲尖峰。
CREATE PROCEDURE get_emp_by_dept (
IN p_deptno SMALLINT,
OUT p_count INTEGER
) DYNAMIC RESULT SETS 1
LANGUAGE SQL
READS SQL DATA
SPECIFIC get_emp_by_dept_v1
BEGIN
DECLARE c1 CURSOR WITH RETURN TO CALLER FOR
SELECT empno, firstnme, lastname, salary
FROM employee
WHERE workdept = p_deptno;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
INSERT INTO proc_error_log VALUES ('get_emp_by_dept', SQLCODE, SQLSTATE, CURRENT TIMESTAMP);
RESIGNAL;
END;
OPEN c1;
SELECT COUNT(*) INTO p_count FROM employee WHERE workdept = p_deptno;
-- 游標結果集自動回傳給呼叫端 (JDBC getMoreResults 等)
END
遵循「參數完整、游標精準、異常分層、暫存表隔離、非法程序主動重綁」五大原則,配合標準模板開發,可顯著降低儲存程序故障率,縮短開發調試週期,釋放 DBA 運維壓力。