首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 程式設計技巧詳解 (二) - CREATE PROCEDURE、暫存表、FETCH FIRST、游標 Handler 模式

     編輯:DB2 教學

1.1 CREATE PROCEDURE 後勿用 TAB

CREATE PROCEDURE ...  -- CREATE 後只能用空格,不可用 TAB,否則編譯失敗

此為 DB2 SQL PL 解析器限制,請養成習慣。

1.2 暫存表使用細節

  • 必須建立在 USER TEMPORARY TABLESPACE 上,僅有 SYSTEM TEMPORARY TABLESPACE 的資料庫無法建立暫存表。
  • DB2 暫存表為 Session 級 可見 (不同於 Sybase/Oracle 的交易/連線級),多執行緒環境難以控制,建議避免使用。
  • 建表加 WITH REPLACE 選項,避免重複建立報錯:
DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_TBL
AS (SELECT * FROM SRC) WITH REPLACE;

1.3 取指定前 N 筆資料

-- 直接查詢
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.4 游標使用 - Handler 模式 (支援 WITH HOLD)

-- 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 模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved