跟屌絲一起學(xué)習(xí) DB2 第五課 存儲(chǔ)過程(二)
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語句來控制循環(huán)
LEAVE語句用來跳出循環(huán)
ITERATE語句用來回到for或者while循環(huán)的開始重新執(zhí)行
示例
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語句用于直接跳轉(zhuǎn)到指定標(biāo)簽處。例如:
IF v_DEPT = ‘D11’
GOTO bye;
……
bye:
RETURN語句
RETURN語句用于向調(diào)用返回。
IF v_DEPT = ‘D11’
RETURN 1;
八 游標(biāo)和結(jié)果集游標(biāo)的聲明
下面是游標(biāo)聲明的幾個(gè)例子:
DECLARE c1 CURSOR FOR select * from staff;
(DECLARE關(guān)鍵字,cl游標(biāo)名稱, CURSOR是必須有的,;指通過c1的游標(biāo)來操作staff里所有的數(shù)據(jù))最常用的最普通的。
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;
游標(biāo)的相關(guān)操作
打開游標(biāo)
OPEN <游標(biāo)名>
提取游標(biāo)
FETCH <游標(biāo)名> INTO <變量列表>
關(guān)閉游標(biāo)
CLOSE <游標(biāo)名>
游標(biāo)的遍歷
DECLARE at_end INT DEFAULT 0; (聲明了at_end的變量,默認(rèn)值是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; (聲明了一個(gè)游標(biāo),把IID的指標(biāo)拿出來)
DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1;
OPEN c1; (進(jìn)行循環(huán))
SET PCOUNT = 0;
ins_loop: LOOP
FETCH c1 INTO PIID;
IF at_end <> 0 THEN
LEAVE ins_loop; ( LEAVE跳出循環(huán))
END IF;
SET PCOUNT = PCOUNT + 1; (表示提取了多少條記錄)
END LOOP;
刪除游標(biāo)對(duì)應(yīng)的數(shù)據(jù)行
DECLARE cursor1 CURSOR FOR SELECT DEPTNO, DEPTNAME, LOCATION
FROM DB2ADMIN.ORG FOR UPDATE;(聲明一個(gè)cursor1的游標(biāo),從一個(gè)表時(shí)提出部門名稱,...,位置)
OPEN cursor1;(打開游標(biāo))
FETCH FROM cursor1 INTO v_DEPTNO, V_DEPTNAME, v_LOCATION;
DELETE FROM DB2ADMIN.ORG WHERE CURRENT OF cursor1;(刪除DB2ADMIN.ORG的記錄; CURRENT OF cursor1這是的游標(biāo)是指向某一個(gè)位置;刪除游標(biāo)指向的當(dāng)前行。)
CLOSE cursor1;(關(guān)閉游標(biāo),也可做一個(gè)循環(huán),刪除所有的內(nèi)容)
更新游標(biāo)對(duì)應(yīng)的數(shù)據(jù)行
1.png)
九 異常處理器
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;
使用游標(biāo)返回多個(gè)結(jié)果集
1.png)
九 異常處理器
異常處理器的聲明
DECLARE handler-type HANDLER FOR condition handler-action;
(語法結(jié)構(gòu))(異常處理器是需要預(yù)先聲明的)
異常處理器的類型(handler-type)
異常處理器的類型有如下幾種:
CONTINUE(繼續(xù))
在異常處理器操作完成之后,會(huì)繼續(xù)執(zhí)行產(chǎn)生這個(gè)異常語句之后的下一條語句。
EXIT(記錄完后就退出,不再繼續(xù)執(zhí)行)
在異常處理器操作完成之后,存儲(chǔ)過程會(huì)終止,并將控制返回給調(diào)用者。
UNDO(撤銷所做的記錄,退出整個(gè)程序)
在異常處理器操作執(zhí)行之前,DB2會(huì)回滾存儲(chǔ)過程中執(zhí)行的SQL操作。在異常處理器操作完成之后,存儲(chǔ)過程會(huì)終止,并將控制返回給調(diào)用者。
異常處理器和SQLSTATE
異常處理器可以處理基于特定SQLSTATE值的定制異常,或者處理預(yù)定義異常的類。預(yù)定義的3種異常如下所示:
NOT FOUND
標(biāo)識(shí)導(dǎo)致SQLCODE值為+100或者SQLSATE值為02000的異常。這個(gè)異常通常在SELECT沒有返回行的時(shí)候出現(xiàn)。
SQLEXCEPTION
標(biāo)識(shí)導(dǎo)致SQLCODE值為負(fù)的異常。
SQLWARNING
標(biāo)識(shí)導(dǎo)致警告異常或者導(dǎo)致+100以外的SQLCODE正值的異常。
注:如果產(chǎn)生了NOT FOUND 或者SQLWARNING異常,并且沒有為這個(gè)異常定義異常處理器,那么就會(huì)忽略這個(gè)異常,并且將控制流轉(zhuǎn)向下一個(gè)語句。如果產(chǎn)生了SQLEXCEPTION異常,并且沒有為這個(gè)異常定義異常處理器,那么存儲(chǔ)過程就會(huì)失敗,并且會(huì)將控制流返回調(diào)用者
異常處理器示例
如下示例聲明了兩個(gè)異常處理器。 EXIT處理器會(huì)在出現(xiàn)SQLEXCEPTION 或者SQLWARNING異常的時(shí)候被調(diào)用。EXIT處理器會(huì)在終止SQL程序之前,將名為stmt的變量設(shè)為“ABORTED”,并且將控制流返回給調(diào)用者。UNDO處理器會(huì)將控制流返回給調(diào)用者之前,回滾存儲(chǔ)過程體中已經(jīng)完成的SQL操作。
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
SET stmt = 'ABORTED';
DECLARE UNDO HANDLER FOR NOT FOUND;
異常處理器定制
如果預(yù)定義異常集不能滿足需求,就可以為特定的SQLSTATE值聲明定制異常,然后再為這個(gè)定制異常聲明處理器。語法如下:
DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
更為復(fù)雜的異常處理器示例(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
上面的異常處理器會(huì)在出現(xiàn)SQLEXCEPTION, SQLWARNING, NOT FOUND異常的時(shí)候觸發(fā)。異常處理器會(huì)取出當(dāng)前的SQLCODE, SQLSTATE,然后根據(jù)它們的值來設(shè)置輸出參數(shù)(poGenStatus)的值。
十 編寫和調(diào)試存儲(chǔ)過程


創(chuàng)建存儲(chǔ)過程
將存儲(chǔ)過程部署到本地或遠(yuǎn)程DB2數(shù)據(jù)庫
修改并重新部署存儲(chǔ)過程
對(duì)存儲(chǔ)過程進(jìn)行測(cè)試和Debug
使用Command Editor創(chuàng)建存儲(chǔ)過程(1 of 3)




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