跟屌絲一起學習 DB2 第五課 存儲過程(二)
REPEAT語句
ftch_loop2:
REPEAT
FETCH c1 INTO v_firstname, v_midinit, v_lastname;
UNTIL SQLCODE <> 0 AND REPEAT ftch_loop2;
WHILE語句
WHILE at_end = 0 DO
FETCH c1 INTO v_firstname, v_midinit, v_lastname;
IF SQLCODE = 100 THEN
SET at_end = 1;
END IF;
END WHILE;
LEAVE和ITERATE語句
LEAVE和ITERATE語句來控制循環
LEAVE語句用來跳出循環
ITERATE語句用來回到for或者while循環的開始重新執行
示例
FETCH_LOOP1: LOOP
FETCH c1 INTO v_dept, v_deptname, v_admdept;
IF at_end = 1 THEN
LEAVE FETCH_LOOP1;
ELSEIF v_dept = ‘D01’ THEN
ITERATE FETCH_LOOP1;
END IF;
INSERT INTO department(deptno, deptname, admdept)
VALUES(‘NEW’, v_deptname, v_admdept);
END LOOP FETCH_LOOP1;
GOTO語句
GOTO語句用于直接跳轉到指定標簽處。例如:
IF v_DEPT = ‘D11’
GOTO bye;
……
bye:
RETURN語句
RETURN語句用于向調用返回。
IF v_DEPT = ‘D11’
RETURN 1;
八 游標和結果集游標的聲明
下面是游標聲明的幾個例子:
DECLARE c1 CURSOR FOR select * from staff;
(DECLARE關鍵字,cl游標名稱, CURSOR是必須有的,;指通過c1的游標來操作staff里所有的數據)最常用的最普通的。
2.DECLARE c1 CURSOR WITH HOLD FOR select * form staff;
3.DECLARE c1 CURSOR WITH RETURN TO CALLER FOR select * form staff;
4.DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR select * form staff;
游標的相關操作
打開游標
OPEN <游標名>
提取游標
FETCH <游標名> INTO <變量列表>
關閉游標
CLOSE <游標名>
游標的遍歷
DECLARE at_end INT DEFAULT 0; (聲明了at_end的變量,默認值是0)
DECLARE PIID INTEGER DEFAULT 0;
DECLARE PINT INTEGER DEFAULT 0;
DECLARE not_found CONDITION FOR SQLSTATE '02000';
DECLARE c1 CURSOR FOR SELECT IID FROM YH; (聲明了一個游標,把IID的指標拿出來)
DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1;
OPEN c1; (進行循環)
SET PCOUNT = 0;
ins_loop: LOOP
FETCH c1 INTO PIID;
IF at_end <> 0 THEN
LEAVE ins_loop; ( LEAVE跳出循環)
END IF;
SET PCOUNT = PCOUNT + 1; (表示提取了多少條記錄)
END LOOP;
刪除游標對應的數據行
DECLARE cursor1 CURSOR FOR SELECT DEPTNO, DEPTNAME, LOCATION
FROM DB2ADMIN.ORG FOR UPDATE;(聲明一個cursor1的游標,從一個表時提出部門名稱,...,位置)
OPEN cursor1;(打開游標)
FETCH FROM cursor1 INTO v_DEPTNO, V_DEPTNAME, v_LOCATION;
DELETE FROM DB2ADMIN.ORG WHERE CURRENT OF cursor1;(刪除DB2ADMIN.ORG的記錄; CURRENT OF cursor1這是的游標是指向某一個位置;刪除游標指向的當前行。)
CLOSE cursor1;(關閉游標,也可做一個循環,刪除所有的內容)
更新游標對應的數據行

九 異常處理器
DECLARE cursor1 CURSOR FOR SELECT DEPTNO, DEPTNAME, LOCATION
FROM DB2ADMIN.ORG FOR UPDATE;
OPEN cursor1;
FETCH FROM cursor1 INTO v_DEPTNO, v_DEPTNAME, v_LOCATION;
UPDATE DB2ADMIN.ORG SET DEPTNAME = ‘NEW NAME’WHERE CURRENT OF cursor1;
CLOSE cursor1;
使用游標返回多個結果集

九 異常處理器
異常處理器的聲明
DECLARE handler-type HANDLER FOR condition handler-action;
(語法結構)(異常處理器是需要預先聲明的)
異常處理器的類型(handler-type)
異常處理器的類型有如下幾種:
CONTINUE(繼續)
在異常處理器操作完成之后,會繼續執行產生這個異常語句之后的下一條語句。
EXIT(記錄完后就退出,不再繼續執行)
在異常處理器操作完成之后,存儲過程會終止,并將控制返回給調用者。
UNDO(撤銷所做的記錄,退出整個程序)
在異常處理器操作執行之前,DB2會回滾存儲過程中執行的SQL操作。在異常處理器操作完成之后,存儲過程會終止,并將控制返回給調用者。
異常處理器和SQLSTATE
異常處理器可以處理基于特定SQLSTATE值的定制異常,或者處理預定義異常的類。預定義的3種異常如下所示:
NOT FOUND
標識導致SQLCODE值為+100或者SQLSATE值為02000的異常。這個異常通常在SELECT沒有返回行的時候出現。
SQLEXCEPTION
標識導致SQLCODE值為負的異常。
SQLWARNING
標識導致警告異常或者導致+100以外的SQLCODE正值的異常。
注:如果產生了NOT FOUND 或者SQLWARNING異常,并且沒有為這個異常定義異常處理器,那么就會忽略這個異常,并且將控制流轉向下一個語句。如果產生了SQLEXCEPTION異常,并且沒有為這個異常定義異常處理器,那么存儲過程就會失敗,并且會將控制流返回調用者
異常處理器示例
如下示例聲明了兩個異常處理器。 EXIT處理器會在出現SQLEXCEPTION 或者SQLWARNING異常的時候被調用。EXIT處理器會在終止SQL程序之前,將名為stmt的變量設為“ABORTED”,并且將控制流返回給調用者。UNDO處理器會將控制流返回給調用者之前,回滾存儲過程體中已經完成的SQL操作。
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
SET stmt = 'ABORTED';
DECLARE UNDO HANDLER FOR NOT FOUND;
異常處理器定制
如果預定義異常集不能滿足需求,就可以為特定的SQLSTATE值聲明定制異常,然后再為這個定制異常聲明處理器。語法如下:
DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
更為復雜的異常處理器示例(1 of 2)
-- Generic Handler
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN NOT ATOMIC
-- Capture SQLCODE & SQLSTATE
SELECT SQLCODE, SQLSTATE
INTO hSqlcode, hSqlstate
FROM SYSIBM.SYSDUMMY1;
-- Use the poGenStatus variable to tell the procedure -- what type of error occurred
CASE hSqlstate
WHEN '02000' THEN
SET poGenStatus=5000;
WHEN '42724' THEN
SET poGenStatus=3;
ELSE IF (hSqlCode < 0) THEN
SET poGenStatus=hSqlCode;
END IF;
END
上面的異常處理器會在出現SQLEXCEPTION, SQLWARNING, NOT FOUND異常的時候觸發。異常處理器會取出當前的SQLCODE, SQLSTATE,然后根據它們的值來設置輸出參數(poGenStatus)的值。
十 編寫和調試存儲過程


創建存儲過程
將存儲過程部署到本地或遠程DB2數據庫
修改并重新部署存儲過程
對存儲過程進行測試和Debug
使用Command Editor創建存儲過程(1 of 3)




posted on 2012-12-11 16:34 順其自然EVO 閱讀(2587) 評論(0) 編輯 收藏 所屬分類: DB2