db2數(shù)據(jù)庫存儲(chǔ)過程_第1頁
db2數(shù)據(jù)庫存儲(chǔ)過程_第2頁
db2數(shù)據(jù)庫存儲(chǔ)過程_第3頁
db2數(shù)據(jù)庫存儲(chǔ)過程_第4頁
db2數(shù)據(jù)庫存儲(chǔ)過程_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、-1-中國移動(dòng)通信集團(tuán)河南有限公司業(yè)務(wù)支援中中國移動(dòng)通信集團(tuán)河南有限公司業(yè)務(wù)支援中心心DB2DB2數(shù)據(jù)庫中的存儲(chǔ)過程數(shù)據(jù)庫中的存儲(chǔ)過程-2-主要內(nèi)容:主要內(nèi)容:1 1、存儲(chǔ)過程介紹、存儲(chǔ)過程介紹2 2、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)3 3、控制語句、控制語句4 4、游標(biāo)和結(jié)果集、游標(biāo)和結(jié)果集5 5、異常處理器、異常處理器6 6、編寫和調(diào)試存儲(chǔ)過程、編寫和調(diào)試存儲(chǔ)過程-3-什么是存儲(chǔ)過程?什么是存儲(chǔ)過程?(Stored Procedure)(Stored Procedure)受受 DB2 DB2 服務(wù)器控制的一段可執(zhí)行程序服務(wù)器控制的一段可執(zhí)行程序可以通過可以通過SQLSQL的的CALLCA

2、LL語句來完成對(duì)存儲(chǔ)過程的調(diào)用語句來完成對(duì)存儲(chǔ)過程的調(diào)用在存儲(chǔ)過程中可以包含業(yè)務(wù)邏輯在存儲(chǔ)過程中可以包含業(yè)務(wù)邏輯存儲(chǔ)過程可以在本地或遠(yuǎn)程進(jìn)行調(diào)用存儲(chǔ)過程可以在本地或遠(yuǎn)程進(jìn)行調(diào)用存儲(chǔ)過程可以接收或傳遞參數(shù),生成結(jié)果集存儲(chǔ)過程可以接收或傳遞參數(shù),生成結(jié)果集-4-什么時(shí)候使用存儲(chǔ)過程?什么時(shí)候使用存儲(chǔ)過程?使用存儲(chǔ)過程的合適時(shí)機(jī)使用存儲(chǔ)過程的合適時(shí)機(jī): :應(yīng)用程序的應(yīng)用程序的性能性能無法滿足預(yù)期時(shí)無法滿足預(yù)期時(shí)客戶端數(shù)量較多且應(yīng)用程序中客戶端數(shù)量較多且應(yīng)用程序中SQLSQL代碼分散時(shí)代碼分散時(shí)應(yīng)用程序需要進(jìn)行應(yīng)用程序需要進(jìn)行繁重繁重的數(shù)據(jù)庫操作,同時(shí)這些操作并不的數(shù)據(jù)庫操作,同時(shí)這些操作并不需要進(jìn)行

3、太多的客戶交互需要進(jìn)行太多的客戶交互應(yīng)用程序代碼更改頻繁應(yīng)用程序代碼更改頻繁需要對(duì)客戶應(yīng)用代碼進(jìn)行訪問控制時(shí)需要對(duì)客戶應(yīng)用代碼進(jìn)行訪問控制時(shí)客戶應(yīng)用需要在一次操作中執(zhí)行多條客戶應(yīng)用需要在一次操作中執(zhí)行多條 SQL SQL 語句語句-5-C/S: C/S: 宏觀交互圖宏觀交互圖-6-主要內(nèi)容:主要內(nèi)容:1 1、存儲(chǔ)過程介紹、存儲(chǔ)過程介紹2 2、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)3 3、控制語句、控制語句4 4、游標(biāo)和結(jié)果集、游標(biāo)和結(jié)果集5 5、異常處理器、異常處理器6 6、編寫和調(diào)試存儲(chǔ)過程、編寫和調(diào)試存儲(chǔ)過程-7-存儲(chǔ)過程結(jié)構(gòu)存儲(chǔ)過程結(jié)構(gòu)CREATE OR REPLACE PROCEDURE

4、CREATE OR REPLACE PROCEDURE ( IN | OUT | INOUT ( IN | OUT | INOUT 參數(shù)名參數(shù)名 數(shù)據(jù)類型數(shù)據(jù)類型 默認(rèn)值默認(rèn)值 ) )LANGUAGE SQLLANGUAGE SQLBEGINBEGIN 業(yè)務(wù)邏輯代碼業(yè)務(wù)邏輯代碼END;END;-8-參數(shù)類型參數(shù)類型ININ(輸入?yún)?shù))(輸入?yún)?shù)) 只是將實(shí)參傳遞給存儲(chǔ)過程,但在存儲(chǔ)過程中不能對(duì)其進(jìn)行修改。換句話說,只是將實(shí)參傳遞給存儲(chǔ)過程,但在存儲(chǔ)過程中不能對(duì)其進(jìn)行修改。換句話說,對(duì)于存儲(chǔ)過程而言它是只讀的。對(duì)于存儲(chǔ)過程而言它是只讀的。OUTOUT(輸出參數(shù))(輸出參數(shù)) 在存儲(chǔ)過程結(jié)束時(shí)向調(diào)

5、用者返回。一般在過程中都會(huì)被賦值。在存儲(chǔ)過程結(jié)束時(shí)向調(diào)用者返回。一般在過程中都會(huì)被賦值。INOUTINOUT(輸入輸出參數(shù))(輸入輸出參數(shù)) 上述兩種參數(shù)類型的結(jié)合體。它可以幫助調(diào)用者將實(shí)參傳遞給進(jìn)程,另外它上述兩種參數(shù)類型的結(jié)合體。它可以幫助調(diào)用者將實(shí)參傳遞給進(jìn)程,另外它也能夠作為輸出參數(shù)被修改和賦值。也能夠作為輸出參數(shù)被修改和賦值。-9-復(fù)合語句復(fù)合語句 復(fù)合語句是指包含在復(fù)合語句是指包含在BEGINBEGIN和和ENDEND間的語句。它一間的語句。它一般包括如下語句類型:般包括如下語句類型:聲明語句聲明語句賦值語句賦值語句控制語句控制語句條件處理語句條件處理語句-10-復(fù)合語句示例復(fù)合語

6、句示例說明:說明:1. 1. 復(fù)合語句可以嵌套使用。復(fù)合語句可以嵌套使用。2. BEGIN2. BEGIN語句可以和標(biāo)簽組合使用,這樣可以更清晰的標(biāo)識(shí)語句塊的范圍。語句可以和標(biāo)簽組合使用,這樣可以更清晰的標(biāo)識(shí)語句塊的范圍。-11-聲明語句聲明語句變量聲明變量聲明DECLARE DECLARE my_varmy_var INTEGER DEFAULT 6; INTEGER DEFAULT 6;條件聲明條件聲明DECLARE DECLARE not_foundnot_found CONDITION FOR SQLSTATE 02000; CONDITION FOR SQLSTATE 02000;游

7、標(biāo)聲明游標(biāo)聲明DECLARE c1 CURSOR FOR select DECLARE c1 CURSOR FOR select * * from staff; from staff;異常處理器聲明異常處理器聲明DECLARE EXIT HANDLER FOR SQLEXCEPTION ;DECLARE EXIT HANDLER FOR SQLEXCEPTION ;-12-賦值語句賦值語句語法語法SET SET lv_namelv_name = expression; = expression;SET SET lv_namelv_name = NULL; = NULL;示例示例(1) SET

8、salary = (1) SET salary = salarysalary + salary + salary * * 0.1; 0.1;(2) SET (2) SET init_salaryinit_salary = NULL; = NULL;(3) SET salary = (select salary from employee where (3) SET salary = (select salary from employee where empnoempno = = lv_emp_numlv_emp_num); );注注: : 如果如果 SELECT SELECT 語句返回記錄超

9、過一行,示例語句返回記錄超過一行,示例 3 3 將會(huì)返回將會(huì)返回SQLERRORSQLERROR。-13-存儲(chǔ)過程例子存儲(chǔ)過程例子-14-嵌套存儲(chǔ)過程例子嵌套存儲(chǔ)過程例子-15-模塊模塊(Module)(Module)模塊是如下幾種對(duì)象的集合:模塊是如下幾種對(duì)象的集合: SPSP,UDFUDF,global variables and cursorsglobal variables and cursors,typestypes,conditionsconditions模塊的主要優(yōu)勢(shì):模塊的主要優(yōu)勢(shì): 結(jié)構(gòu)良好,便于組織結(jié)構(gòu)良好,便于組織 范圍限定范圍限定 CALL CALL mySchema.

10、myModule.myProcmySchema.myModule.myProc() () 信息隱藏信息隱藏 每個(gè)對(duì)象都可以是每個(gè)對(duì)象都可以是 public public 或或 privateprivate 權(quán)限控制權(quán)限控制 可以模塊為單位,而不是以模塊中的對(duì)象為單位來控制權(quán)限可以模塊為單位,而不是以模塊中的對(duì)象為單位來控制權(quán)限-16-模塊模塊 - - 規(guī)格說明規(guī)格說明(Module Specification)(Module Specification)模塊可以發(fā)布模塊可以發(fā)布type, SP, UDFtype, SP, UDF以供外部使用。以供外部使用。CREATE OR REPLACE M

11、ODULE CREATE OR REPLACE MODULE myModmyMod; ;ALTER MODULE ALTER MODULE myModmyMod PUBLISH PUBLISH TYPE TYPE myRowTypmyRowTyp AS ANCHOR ROW AS ANCHOR ROW myTabmyTab; ;ALTER MODULE ALTER MODULE myModmyMod PUBLISH PUBLISH FUNCTION myFunc(val1 ANCHOR myTab.col1) FUNCTION myFunc(val1 ANCHOR myTab.col1) RE

12、TURNS RETURNS myRowTypmyRowTyp; ;ALTER MODULE ALTER MODULE myModmyMod PUBLISH PUBLISH PROCEDURE PROCEDURE myProc(OUTmyProc(OUT param1 ANCHOR myTab.col2); param1 ANCHOR myTab.col2);-17-模塊模塊 - - 實(shí)現(xiàn)實(shí)現(xiàn)(Module Implementation)(Module Implementation)下面的代碼是模塊的實(shí)現(xiàn)部分:下面的代碼是模塊的實(shí)現(xiàn)部分:ALTERALTER MODULEMODULE myMod

13、myMod ADD VARIABLEADD VARIABLE pkgVarpkgVar ANCHORANCHOR myTab.col1;myTab.col1;ALTERALTER MODULEMODULE myModmyMod ADDADD FUNCTION FUNCTION myFunc(val1myFunc(val1 ANCHORANCHOR myTab.col1) myTab.col1) RETURNSRETURNS myRowTypmyRowTypBEGINBEGIN DECLARE DECLARE var1var1 myRowTypmyRowTyp; ; SELECT SELECT

14、* * INTOINTO var1 var1 FROMFROM myTabmyTab WHEREWHERE col1col1 col1 pkgVarpkgVar; ;RETURNRETURN var1;var1;ENDENDALTERALTER MODULEMODULE myModmyMod ADDADD PROCEDURE PROCEDURE myProc(myProc(OUTOUT param1param1 ANCHORANCHOR myTab.col2)myTab.col2)BEGINBEGIN DECLARE DECLARE varRowvarRow myRowTypmyRowTyp;

15、 ;SETSET param1param1 = = varRow.col2varRow.col2 pkgVarpkgVar; ;ENDEND-18-模塊模塊 - - 其他語句其他語句刪除整個(gè)模塊刪除整個(gè)模塊 DROP MODULE DROP MODULE myModmyMod; ;保留規(guī)格說明內(nèi)容,刪除實(shí)現(xiàn)保留規(guī)格說明內(nèi)容,刪除實(shí)現(xiàn) ALTER MODULE ALTER MODULE myModmyMod DROP BODY; DROP BODY;刪除模塊中的存儲(chǔ)過程刪除模塊中的存儲(chǔ)過程(SP)(SP) ALTER MODULE ALTER MODULE myModmyMod DROP PRO

16、CEDURE DROP PROCEDURE myProcmyProc; ;將模塊的執(zhí)行權(quán)限賦給將模塊的執(zhí)行權(quán)限賦給joejoe GRANT EXECUTE ON MODULE GRANT EXECUTE ON MODULE myModmyMod TO TO joejoe; ;-19-主要內(nèi)容:主要內(nèi)容:1 1、存儲(chǔ)過程介紹、存儲(chǔ)過程介紹2 2、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)3 3、控制語句、控制語句4 4、游標(biāo)和結(jié)果集、游標(biāo)和結(jié)果集5 5、異常處理器、異常處理器6 6、編寫和調(diào)試存儲(chǔ)過程、編寫和調(diào)試存儲(chǔ)過程-20-IF IF語句語句格式:格式:IF IF 條件1 THENTHEN stat

17、ement1;statement1;ELSEIFELSEIF 條件2 THENTHEN statement2;statement2;ELSEELSE statement3;statement3; END END IF;IF;注注: :條件成立時(shí)為條件成立時(shí)為TRUE (TRUE (真真), ),不成立時(shí)為不成立時(shí)為FALSE(FALSE(假假) ) 和和 NULLNULL-21-IF IF語句例子語句例子IF IF ratingrating = = 1 1 THENTHENUPDATEUPDATE EMPLOYEE SETEMPLOYEE SET salarysalary = = salary

18、salary* *1.101.10 WHEREWHERE empnoempno = = i_num;i_num;(如果滿足于(如果滿足于.時(shí),薪水調(diào)整時(shí),薪水調(diào)整1.11.1倍)倍)ELSEIFELSEIF ratingrating = = 2 2 THENTHENUPDATEUPDATE EMPLOYEE SETEMPLOYEE SET salarysalary = = salarysalary* *1.051.05 WHEREWHERE empnoempno = = i_numi_num; ;ELSEELSEUPDATEUPDATE EMPLOYEE SETEMPLOYEE SET sal

19、arysalary = = salarysalary* *1.031.03 WHEREWHERE empnoempno = = i_numi_num; ;ENDEND IF;IF;-22-CASECASE語句(語句(1 of 21 of 2)簡(jiǎn)單簡(jiǎn)單CASECASE語句語句-23-CASECASE語句(語句(2 of 22 of 2)稍加變形的稍加變形的CASECASE語句語句-24-LOOPLOOP語句語句語法語法LABEL LOOPLABEL LOOP SQL-procedure-statements; SQL-procedure-statements; END END LOOP LABE

20、L;LOOP LABEL;示例示例fetch_loopfetch_loop: LOOP: LOOPFETCH c1 INTO c1 INTO v_firstnamev_firstname, , v_lastnamev_lastname; ; SET counter = SET counter = countercounter + 1; + 1; IF counter = 51 THEN IF counter = 51 THEN LEAVE LEAVE fetch_loopfetch_loop; ; END IF; END IF;ENDEND LOOP LOOP fetch_loopfetch_

21、loop; ;標(biāo)簽標(biāo)簽關(guān)鍵字關(guān)鍵字-25-FORFOR語句語句語法語法LABEL FOR for-loop-name AS cursor-name CURSOR FORLABEL FOR for-loop-name AS cursor-name CURSOR FOR select-statement select-statement DODO SQL-procedure-statements; SQL-procedure-statements; END END FOR LABEL; LABEL;示例示例DECLARE DECLARE fullnamefullname CHAR(40); CHA

22、R(40);FOR v1 AS c1 CURSOR FOR FOR v1 AS c1 CURSOR FOR SELECT SELECT firstnmefirstnme, , midinitmidinit, , lastnamelastname FROM employee FROM employeeDODO SET SET fullnamefullname= =lastname|,|firstnme|,|midinitlastname|,|firstnme|,|midinit; ; INSERT INTO INSERT INTO tnametname VALUE ( VALUE (fullna

23、mefullname); );END FOR;END FOR;-26-其他控制語句其他控制語句REPEATREPEAT語句語句ftch_loop2:ftch_loop2:REPEATREPEAT FETCH c1 INTO FETCH c1 INTO v_firstnamev_firstname, , v_midinitv_midinit, , v_lastnamev_lastname; ;UNTIL SQLCODE 0 AND REPEAT ftch_loop2;UNTIL SQLCODE 0 AND REPEAT ftch_loop2;WHILEWHILE語句語句WHILE WHILE a

24、t_endat_end = 0 DO = 0 DO FETCH c1 INTO FETCH c1 INTO v_firstnamev_firstname, , v_midinitv_midinit, , v_lastnamev_lastname; ; IF SQLCODE = 100 THEN IF SQLCODE = 100 THEN SET SET at_endat_end = 1; = 1; END IF; END IF;END WHILE;END WHILE;-27-LEAVELEAVE和和ITERATEITERATE語句語句LEAVELEAVE和和ITERATEITERATE語句來控

25、制循環(huán)語句來控制循環(huán) LEAVELEAVE語句用來跳出循環(huán)語句用來跳出循環(huán) ITERATEITERATE語句用來回到語句用來回到forfor或者或者whilewhile循環(huán)的開始重新執(zhí)行循環(huán)的開始重新執(zhí)行示例示例FETCH_LOOP1: LOOPFETCH_LOOP1: LOOP FETCH c1 INTO FETCH c1 INTO v_deptv_dept, , v_deptnamev_deptname, , v_admdeptv_admdept; ; IF IF at_endat_end = 1 = 1 THEN THEN LEAVE FETCH_LOOP1; LEAVE FETCH_L

26、OOP1; ELSEIF ELSEIF v_deptv_dept = D01 THEN = D01 THEN ITERATE FETCH_LOOP1; ITERATE FETCH_LOOP1; END IF; END IF; INSERT INTO INSERT INTO department(deptnodepartment(deptno, , deptnamedeptname, , admdeptadmdept) ) VALUES(NEW, VALUES(NEW, v_deptnamev_deptname, , v_admdeptv_admdept); );END LOOP FETCH_L

27、OOP1;END LOOP FETCH_LOOP1;-28-GOTOGOTO語句語句GOTOGOTO語句用于直接跳轉(zhuǎn)到指定標(biāo)簽處。例如:語句用于直接跳轉(zhuǎn)到指定標(biāo)簽處。例如:IF IF v_DEPTv_DEPT = D11 = D11 GOTO bye; GOTO bye;bye:bye:-29-RETURNRETURN語句語句RETURNRETURN語句用于向調(diào)用返回。語句用于向調(diào)用返回。IF IF v_DEPTv_DEPT = D11 = D11 RETURN 1; RETURN 1;-30-主要內(nèi)容:主要內(nèi)容:1 1、存儲(chǔ)過程介紹、存儲(chǔ)過程介紹2 2、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)3

28、3、控制語句、控制語句4 4、游標(biāo)和結(jié)果集、游標(biāo)和結(jié)果集5 5、異常處理器、異常處理器6 6、編寫和調(diào)試存儲(chǔ)過程、編寫和調(diào)試存儲(chǔ)過程-31-游標(biāo)的聲明游標(biāo)的聲明下面是游標(biāo)聲明的幾個(gè)例子:下面是游標(biāo)聲明的幾個(gè)例子:1.1.DECLARE c1 CURSOR FOR select DECLARE c1 CURSOR FOR select * * from from staff;staff;2.2.(DECLAREDECLARE關(guān)鍵字,關(guān)鍵字,clcl游標(biāo)名稱,游標(biāo)名稱, CURSORCURSOR是必須有的,;指通過是必須有的,;指通過c1c1的游標(biāo)來操作的游標(biāo)來操作staffstaff里所有的數(shù)據(jù)

29、)最常里所有的數(shù)據(jù))最常用的最普通的。用的最普通的。3.3.2.DECLARE2.DECLARE c1 CURSOR WITH HOLD FOR select c1 CURSOR WITH HOLD FOR select * * form form staff;staff;4.4.3.DECLARE3.DECLARE c1 CURSOR WITH RETURN TO CALLER FOR c1 CURSOR WITH RETURN TO CALLER FOR select select * * form staff; form staff;5.5.4.DECLARE4.DECLARE c1 C

30、URSOR WITH RETURN TO CLIENT FOR c1 CURSOR WITH RETURN TO CLIENT FOR select select * * form staff; form staff;-32-游標(biāo)的相關(guān)操作游標(biāo)的相關(guān)操作打開游標(biāo)打開游標(biāo)OPEN OPEN 提取游標(biāo)提取游標(biāo)FETCH FETCH INTO INTO 關(guān)閉游標(biāo)關(guān)閉游標(biāo)CLOSE CLOSE -33-游標(biāo)的遍歷游標(biāo)的遍歷DECLARE DECLARE at_endat_end INT DEFAULT 0; INT DEFAULT 0; (聲明了(聲明了at_endat_end的變量,默認(rèn)值是的變量,

31、默認(rèn)值是0 0)DECLARE PIID INTEGER DEFAULT 0;DECLARE PIID INTEGER DEFAULT 0;DECLARE PINT INTEGER DEFAULT 0;DECLARE PINT INTEGER DEFAULT 0;DECLARE DECLARE not_foundnot_found CONDITION CONDITIONFORFORSQLSTATESQLSTATE02000; 02000; DECLARE c1 CURSOR FOR SELECT IID FROM YH; DECLARE c1 CURSOR FOR SELECT IID FRO

32、M YH; (聲明了一個(gè)游標(biāo),把聲明了一個(gè)游標(biāo),把IIDIID的指標(biāo)拿出來)的指標(biāo)拿出來)DECLARE CONTINUE HANDLER FOR DECLARE CONTINUE HANDLER FOR not_foundnot_found SET SET at_endat_end = 1; = 1; OPENOPENc1; c1; (進(jìn)行循環(huán))(進(jìn)行循環(huán))SET PCOUNT = 0; SET PCOUNT = 0; ins_loopins_loop: LOOP: LOOP FETCH c1 INTO PIID; FETCH c1 INTO PIID; IF IF at_endat_end

33、 0 THEN 0 THEN LEAVE LEAVE ins_loop; ins_loop; ( LEAVELEAVE跳出循環(huán))跳出循環(huán)) END IF; END IF; SET PCOUNT = SET PCOUNT = PCOUNTPCOUNT + + 1; 1; (表示提取了多少條記錄)(表示提取了多少條記錄)END LOOP;END LOOP;-34-刪除游標(biāo)對(duì)應(yīng)的數(shù)據(jù)行刪除游標(biāo)對(duì)應(yīng)的數(shù)據(jù)行DECLAREDECLARE cursor1cursor1 CURSORCURSOR FOR FOR SELECTSELECT DEPTNO,DEPTNO, DEPTNAME,DEPTNAME, L

34、OCATIONLOCATION FROMFROM DB2ADMIN.ORG FORDB2ADMIN.ORG FOR UPDATE;UPDATE;(聲明一個(gè)聲明一個(gè)cursor1cursor1的游標(biāo),從一個(gè)表時(shí)提出部門名稱,的游標(biāo),從一個(gè)表時(shí)提出部門名稱,.,位置),位置)OPENOPEN cursor1;cursor1;(打開游標(biāo))(打開游標(biāo))FETCHFETCH FROMFROM cursor1cursor1 INTOINTO v_DEPTNOv_DEPTNO, , V_DEPTNAME, V_DEPTNAME, v_LOCATION;v_LOCATION;DELETE FROM DB2AD

35、MIN.ORG WHERE CURRENT OF DELETE FROM DB2ADMIN.ORG WHERE CURRENT OF cursor1;cursor1;(刪除刪除DB2ADMIN.ORGDB2ADMIN.ORG的記錄;的記錄; CURRENT OF cursor1CURRENT OF cursor1這是的游標(biāo)是指向某一個(gè)位置;刪除游標(biāo)指向的當(dāng)前行。)這是的游標(biāo)是指向某一個(gè)位置;刪除游標(biāo)指向的當(dāng)前行。)CLOSE CLOSE cursor1;cursor1;(關(guān)閉游標(biāo),也可做一個(gè)循環(huán),刪除所有的內(nèi)容關(guān)閉游標(biāo),也可做一個(gè)循環(huán),刪除所有的內(nèi)容)-35-更新游標(biāo)對(duì)應(yīng)的數(shù)據(jù)行更新游標(biāo)對(duì)應(yīng)的

36、數(shù)據(jù)行DECLAREDECLARE cursor1cursor1 CURSORCURSOR FOR FOR SELECTSELECT DEPTNO,DEPTNO, DEPTNAME,DEPTNAME, LOCATIONLOCATION FROMFROM DB2ADMIN.ORG DB2ADMIN.ORG FORFOR UPDATE;UPDATE;OPENOPEN cursor1;cursor1;FETCHFETCH FROMFROM cursor1cursor1 INTOINTO v_DEPTNOv_DEPTNO, , v_DEPTNAMEv_DEPTNAME, , v_LOCATIONv_L

37、OCATION; ;UPDATE DB2ADMIN.ORG SET DEPTNAME = NEW NAMEWHERE CURRENT OF UPDATE DB2ADMIN.ORG SET DEPTNAME = NEW NAMEWHERE CURRENT OF cursor1;cursor1;CLOSE cursor1;CLOSE cursor1;-36-使用游標(biāo)返回多個(gè)結(jié)果集使用游標(biāo)返回多個(gè)結(jié)果集動(dòng)態(tài)的結(jié)果集兩個(gè)動(dòng)態(tài)的結(jié)果集兩個(gè)處于打開的狀態(tài)?處于打開的狀態(tài)?-37-主要內(nèi)容:主要內(nèi)容:1 1、存儲(chǔ)過程介紹、存儲(chǔ)過程介紹2 2、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)3 3、控制語句、控制語句4 4

38、、游標(biāo)和結(jié)果集、游標(biāo)和結(jié)果集5 5、異常處理器、異常處理器6 6、編寫和調(diào)試存儲(chǔ)過程、編寫和調(diào)試存儲(chǔ)過程-38-異常處理器的聲明異常處理器的聲明DECLARE handler-type HANDLER FOR condition handler-action;DECLARE handler-type HANDLER FOR condition handler-action; (語法結(jié)構(gòu))(異常處理器是需要預(yù)先聲明的)(語法結(jié)構(gòu))(異常處理器是需要預(yù)先聲明的)-39-異常處理器的類型(異常處理器的類型(handler-typehandler-type)異常處理器的類型有如下幾種:異常處理器的類型

39、有如下幾種:CONTINUECONTINUE(繼續(xù)繼續(xù)) 在異常處理器操作完成之后,會(huì)繼續(xù)執(zhí)行產(chǎn)生這個(gè)異常語句之后的下一條語句。在異常處理器操作完成之后,會(huì)繼續(xù)執(zhí)行產(chǎn)生這個(gè)異常語句之后的下一條語句。 EXITEXIT(記錄完后就退出,不再繼續(xù)執(zhí)行記錄完后就退出,不再繼續(xù)執(zhí)行) 在異常處理器操作完成之后,存儲(chǔ)過程會(huì)終止,并將控制返回給調(diào)用者。在異常處理器操作完成之后,存儲(chǔ)過程會(huì)終止,并將控制返回給調(diào)用者。 UNDOUNDO(撤銷所做的記錄,退出整個(gè)程序撤銷所做的記錄,退出整個(gè)程序) 在異常處理器操作執(zhí)行之前,在異常處理器操作執(zhí)行之前,DB2DB2會(huì)回滾存儲(chǔ)過程中執(zhí)行的會(huì)回滾存儲(chǔ)過程中執(zhí)行的SQL

40、SQL操作。在異常處理器操作。在異常處理器操作完成之后,存儲(chǔ)過程會(huì)終止,并將控制返回給調(diào)用者。操作完成之后,存儲(chǔ)過程會(huì)終止,并將控制返回給調(diào)用者。 -40-異常處理器和異常處理器和SQLSTATESQLSTATE 異常處理器可以處理基于特定異常處理器可以處理基于特定SQLSTATESQLSTATE值的定制異常,或者處理預(yù)定值的定制異常,或者處理預(yù)定義異常的類。預(yù)定義的義異常的類。預(yù)定義的3 3種異常如下所示:種異常如下所示: NOT FOUNDNOT FOUND 標(biāo)識(shí)導(dǎo)致標(biāo)識(shí)導(dǎo)致SQLCODESQLCODE值為值為100100或者或者SQLSATESQLSATE值為值為0200002000的異

41、常。這個(gè)異常通的異常。這個(gè)異常通常在常在SELECTSELECT沒有返回行的時(shí)候出現(xiàn)。沒有返回行的時(shí)候出現(xiàn)。 SQLEXCEPTIONSQLEXCEPTION 標(biāo)識(shí)導(dǎo)致標(biāo)識(shí)導(dǎo)致SQLCODESQLCODE值為負(fù)的異常。值為負(fù)的異常。 SQLWARNINGSQLWARNING 標(biāo)識(shí)導(dǎo)致警告異?;蛘邔?dǎo)致標(biāo)識(shí)導(dǎo)致警告異常或者導(dǎo)致100100以外的以外的SQLCODESQLCODE正值的異常。正值的異常。 注注: :如果產(chǎn)生了如果產(chǎn)生了NOT FOUND NOT FOUND 或者或者SQLWARNINGSQLWARNING異常,并且沒有為這個(gè)異常定義異常處理器,異常,并且沒有為這個(gè)異常定義異常處理器,

42、那么就會(huì)忽略這個(gè)異常,并且將控制流轉(zhuǎn)向下一個(gè)語句。如果產(chǎn)生了那么就會(huì)忽略這個(gè)異常,并且將控制流轉(zhuǎn)向下一個(gè)語句。如果產(chǎn)生了SQLEXCEPTIONSQLEXCEPTION異常,異常,并且沒有為這個(gè)異常定義異常處理器,那么存儲(chǔ)過程就會(huì)失敗,并且會(huì)將控制流返回調(diào)用并且沒有為這個(gè)異常定義異常處理器,那么存儲(chǔ)過程就會(huì)失敗,并且會(huì)將控制流返回調(diào)用者。者。 -41-異常處理器示例異常處理器示例 如下示例聲明了兩個(gè)異常處理器。如下示例聲明了兩個(gè)異常處理器。 EXITEXIT處理器會(huì)在出現(xiàn)處理器會(huì)在出現(xiàn)SQLEXCEPTION SQLEXCEPTION 或者或者SQLWARNINGSQLWARNING異常的時(shí)候

43、被調(diào)用。異常的時(shí)候被調(diào)用。EXITEXIT處理器會(huì)在終止處理器會(huì)在終止SQLSQL程序之前,將名為程序之前,將名為stmtstmt的變量設(shè)為的變量設(shè)為“ABORTED”,“ABORTED”,并且將控制流返回給調(diào)用者。并且將控制流返回給調(diào)用者。UNDOUNDO處理器會(huì)將處理器會(huì)將控制流返回給調(diào)用者之前,回滾存儲(chǔ)過程體中已經(jīng)完成的控制流返回給調(diào)用者之前,回滾存儲(chǔ)過程體中已經(jīng)完成的SQLSQL操作。操作。 DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNIN

44、G SET stmt = ABORTED; SET stmt = ABORTED; DECLARE UNDO HANDLER FOR NOT FOUND; DECLARE UNDO HANDLER FOR NOT FOUND; -42-異常處理器定制異常處理器定制 如果預(yù)定義異常集不能滿足需求,就可以為特定的如果預(yù)定義異常集不能滿足需求,就可以為特定的SQLSTATESQLSTATE值聲明定值聲明定制異常,然后再為這個(gè)定制異常聲明處理器。語法如下:制異常,然后再為這個(gè)定制異常聲明處理器。語法如下: DECLARE unique-name CONDITION FOR SQLSATE DECLAR

45、E unique-name CONDITION FOR SQLSATE sqlstatesqlstate -43-更為復(fù)雜的異常處理器示例(更為復(fù)雜的異常處理器示例(1 of 21 of 2) - Generic Handler - Generic Handler DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN NOT ATOMIC BEGIN NOT ATOMIC - C

46、apture SQLCODE & SQLSTATE - Capture SQLCODE & SQLSTATE SELECT SQLCODE, SQLSTATE SELECT SQLCODE, SQLSTATE INTO INTO hSqlcodehSqlcode, , hSqlstatehSqlstate FROM SYSIBM.SYSDUMMY1; FROM SYSIBM.SYSDUMMY1; - Use the - Use the poGenStatuspoGenStatus variable to tell the procedure - what type of err

47、or occurred variable to tell the procedure - what type of error occurred CASE CASE hSqlstatehSqlstate WHEN 02000 THEN WHEN 02000 THEN SET SET poGenStatuspoGenStatus=5000; =5000; WHEN 42724 THEN WHEN 42724 THEN SET SET poGenStatuspoGenStatus=3; =3; ELSE IF ( ELSE IF (hSqlCodehSqlCode 0) THEN 0) THEN

48、SET SET poGenStatuspoGenStatus= =hSqlCodehSqlCode; ; END IF; END IF; END END -44-更為復(fù)雜的異常處理器示例(更為復(fù)雜的異常處理器示例(2 of 22 of 2) 上面的異常處理器會(huì)在出現(xiàn)上面的異常處理器會(huì)在出現(xiàn)SQLEXCEPTION, SQLWARNING, NOT SQLEXCEPTION, SQLWARNING, NOT FOUNDFOUND異常的時(shí)候觸發(fā)。異常處理器會(huì)取出當(dāng)前的異常的時(shí)候觸發(fā)。異常處理器會(huì)取出當(dāng)前的SQLCODE, SQLCODE, SQLSTATESQLSTATE,然后根據(jù)它們的值來設(shè)置輸出參數(shù)(,然后根據(jù)它們的值來設(shè)置輸出參數(shù)(poGenStatuspoGenStatus)的值。)的值。 -45-主要內(nèi)容:主要內(nèi)容:1 1、存儲(chǔ)過程介紹、存儲(chǔ)過程介紹2 2、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)、存儲(chǔ)過程基礎(chǔ)結(jié)構(gòu)3 3、控制語句、控制語句4 4、游標(biāo)和結(jié)果集、游標(biāo)和結(jié)果

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論