動態游標在 DB2 存儲過程中處理動態 SQL 時極為關鍵。本文通過完整範例代碼,示範動態游標的宣告、準備、開啟、擷取與錯誤處理標準模式。
CREATE PROCEDURE data_wtptest(
IN in_taskid_timestamp VARCHAR(30),
OUT o_err_no INT,
OUT o_err_msg VARCHAR(1024)
)
LANGUAGE SQL
P1: BEGIN ATOMIC
-- 變數宣告區
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLStmt VARCHAR(1024) DEFAULT '';
DECLARE r_code INTEGER DEFAULT 0;
DECLARE state VARCHAR(1024) DEFAULT 'AAA';
DECLARE at_end INT DEFAULT 0;
DECLARE t_destnetid INT DEFAULT 0;
DECLARE t_recvid VARCHAR(30) DEFAULT '';
DECLARE SP_Name VARCHAR(50) DEFAULT 'data_integrate';
-- 動態游標宣告
DECLARE stmt1 STATEMENT;
DECLARE c1 CURSOR FOR stmt1;
-- 異常處理器
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET r_code = SQLCODE;
SET o_err_no = 1;
SET o_err_msg = '處理[' || state || ']出錯, 錯誤代碼 SQLCODE:[' || CHAR(r_code) || '].';
INSERT INTO fcc_sp_log(object, name, value) VALUES(SP_Name, in_taskid_timestamp, o_err_msg);
END;
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET at_end = 1;
SET state = '找到0行記錄或已經到記錄結尾.';
END;
-- 後續邏輯: PREPARE、OPEN、FETCH 循環...
END P1
DECLARE stmt1 STATEMENT; DECLARE c1 CURSOR FOR stmt1; 確立動態游標基礎,游標綁定至可執行的 statement 物件。EXIT HANDLER FOR SQLEXCEPTION:捕獲所有 SQL 錯誤,記錄錯誤碼、上下文狀態、寫入日誌表;CONTINUE HANDLER FOR NOT FOUND:優雅處理游標擷取結束,設定旗標 at_end=1 供主迴圈判斷。state 變數記錄當前處理階段,錯誤日誌可精準定位失敗環節。PREPARE stmt1 FROM SQLStmt; — 將動態 SQL 字串編譯為可執行 statement;OPEN c1; — 開啟游標;FETCH c1 INTO ...; 迴圈擷取資料行;at_end 旗標退出迴圈;CLOSE c1; 釋放資源。SQLStmt 應透過參數化構建,防止注入;c_employee) 提升可讀性;fcc_sp_log 設計應包含時間戳、過程名、輸入參數、錯誤詳情,便於事後審計。