CREATE PROCEDURE ... -- CREATE 後只能用空格,不可用 TAB,否則編譯失敗
此為 DB2 SQL PL 解析器限制,請養成習慣。
WITH REPLACE 選項,避免重複建立報錯:DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_TBL
AS (SELECT * FROM SRC) WITH REPLACE;
-- 直接查詢
SELECT * FROM TB_MARKET_CODE FETCH FIRST 1 ROW ONLY;
-- 存入變數:不可直接用 SELECT INTO + FETCH FIRST
-- 錯誤: SELECT COL INTO V_COL FROM TBL FETCH FIRST 1 ROW ONLY;
-- 正確: 使用游標
DECLARE V_COL CHAR(1);
DECLARE C1 CURSOR FOR SELECT COL FROM TBL FETCH FIRST 1 ROW ONLY FOR UPDATE;
OPEN C1;
FETCH C1 INTO V_COL;
CLOSE C1;
-- 1. 定義 NOT FOUND Handler
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET V_NOTFOUND = 1;
END;
-- 2. 定義游標 (可加 WITH HOLD)
DECLARE C1 CURSOR WITH HOLD FOR SELECT COL FROM TBL FOR UPDATE;
-- 3. 開啟與迴圈
OPEN C1;
SET V_NOTFOUND = 0;
FETCH C1 INTO V_COL;
WHILE V_NOTFOUND = 0 DO
-- 處理邏輯
SET V_NOTFOUND = 0; -- 重置
FETCH C1 INTO V_COL;
END WHILE;
CLOSE C1;
WITH HOLD,Commit/Rollback 時游標不關閉;靈活控制。FOR UPDATE 不能與 GROUP BY、DISTINCT、ORDER BY、FOR READ ONLY、UNION/EXCEPT/INTERSECT (除 UNION ALL) 同時使用。COMMIT/ROLLBACK,必須使用 WITH HOLD 且採用 Handler 模式。