《[精选]db2数据库存储过程knc.pptx》由会员分享,可在线阅读,更多相关《[精选]db2数据库存储过程knc.pptx(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-1-中国移动通信集团河南有限公司业务支援中中国移动通信集团河南有限公司业务支援中心心DB2DB2数据库中的存储过程数据库中的存储过程-2-主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程-3-什么是存储过程?什么是存储过程?(Stored Procedure)(Stored Procedure)受受 DB2 DB2 服务器控制的一段可执行程序服务器控制的一段可执行程序可以通过可以通过SQLSQL的的CALLCA
2、LL语句来完成对存储过程的调用语句来完成对存储过程的调用在存储过程中可以包含业务逻辑在存储过程中可以包含业务逻辑存储过程可以在本地或远程进行调用存储过程可以在本地或远程进行调用存储过程可以接收或传递参数,生成结果集存储过程可以接收或传递参数,生成结果集-4-什么时候使用存储过程?什么时候使用存储过程?使用存储过程的合适时机使用存储过程的合适时机:应用程序的应用程序的性能性能无法满足预期时无法满足预期时客户端数量较多且应用程序中客户端数量较多且应用程序中SQLSQL代码分散时代码分散时应用程序需要进行应用程序需要进行繁重繁重的数据库操作,同时这些操作并不的数据库操作,同时这些操作并不需要进行太多
3、的客户交互需要进行太多的客户交互应用程序代码更改频繁应用程序代码更改频繁需要对客户应用代码进行访问控制时需要对客户应用代码进行访问控制时客户应用需要在一次操作中执行多条客户应用需要在一次操作中执行多条 SQL SQL 语句语句-5-C/S:C/S:宏观交互图宏观交互图-6-主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程-7-存储过程结构存储过程结构CREATE OR REPLACE PROCEDURE CREA
4、TE OR REPLACE PROCEDURE (IN|OUT|INOUT (IN|OUT|INOUT 参数名参数名 数据类型数据类型 默认值默认值 )LANGUAGE SQLLANGUAGE SQLBEGINBEGIN 业务逻辑代码业务逻辑代码END;END;-8-参数类型参数类型ININ(输入参数)(输入参数)只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说,只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说,对于存储过程而言它是只读的。对于存储过程而言它是只读的。OUTOUT(输出参数)(输出参数)在存储过程结束时向调用者返回。一般在过程中都会被赋值。在
5、存储过程结束时向调用者返回。一般在过程中都会被赋值。INOUTINOUT(输入输出参数)(输入输出参数)上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另外它上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另外它也能够作为输出参数被修改和赋值。也能够作为输出参数被修改和赋值。-9-复合语句复合语句 复合语句是指包含在复合语句是指包含在BEGINBEGIN和和ENDEND间的语句。它一间的语句。它一般包括如下语句类型:般包括如下语句类型:声明语句声明语句赋值语句赋值语句控制语句控制语句条件处理语句条件处理语句-10-复合语句示例复合语句示例说明:说明:1.1.复合语句可以
6、嵌套使用。复合语句可以嵌套使用。2.BEGIN2.BEGIN语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。-11-声明语句声明语句变量声明变量声明DECLARE my_var INTEGER DEFAULT 6;DECLARE my_var INTEGER DEFAULT 6;条件声明条件声明DECLARE not_found CONDITION FOR SQLSTATE 02000;DECLARE not_found CONDITION FOR SQLSTATE 02000;游标声明游标声明DECLARE c1 CURSO
7、R FOR select *from staff;DECLARE c1 CURSOR FOR select *from staff;异常处理器声明异常处理器声明DECLARE EXIT HANDLER FOR SQLEXCEPTION ;DECLARE EXIT HANDLER FOR SQLEXCEPTION ;-12-赋值语句赋值语句语法语法SET lv_name =expression;SET lv_name =expression;SET lv_name =NULL;SET lv_name =NULL;示例示例(1)SET salary =salary +salary *0.1;(1)
8、SET salary =salary +salary *0.1;(2)SET init_salary =NULL;(2)SET init_salary =NULL;(3)SET salary =(select salary from employee where empno =lv_emp_num);(3)SET salary =(select salary from employee where empno =lv_emp_num);注注:如果如果 SELECT SELECT 语句返回记录超过一行,示例语句返回记录超过一行,示例 3 3 将会返回将会返回SQLERRORSQLERROR。-1
9、3-存储过程例子存储过程例子-14-嵌套存储过程例子嵌套存储过程例子-15-模块模块(Module)(Module)模块是如下几种对象的集合:模块是如下几种对象的集合:SPSP,UDFUDF,global variables and cursorsglobal variables and cursors,typestypes,conditionsconditions模块的主要优势:模块的主要优势:结构良好,便于组织结构良好,便于组织范围限定范围限定CALL mySchema.myModule.myProc()CALL mySchema.myModule.myProc()信息隐藏信息隐藏每个对象
10、都可以是每个对象都可以是 public public 或或 privateprivate权限控制权限控制可以模块为单位,而不是以模块中的对象为单位来控制权限可以模块为单位,而不是以模块中的对象为单位来控制权限-16-模块模块-规格说明规格说明(Module Specification)(Module Specification)模块可以发布模块可以发布type,SP,UDFtype,SP,UDF以供外部使用。以供外部使用。CREATE OR REPLACE MODULE myMod;CREATE OR REPLACE MODULE myMod;ALTER MODULE myMod PUBLIS
11、HALTER MODULE myMod PUBLISH TYPE myRowTyp AS ANCHOR ROW myTab;TYPE myRowTyp AS ANCHOR ROW myTab;ALTER MODULE myMod PUBLISHALTER MODULE myMod PUBLISH FUNCTION myFunc(val1 ANCHOR myTab.col1)FUNCTION myFunc(val1 ANCHOR myTab.col1)RETURNS myRowTyp;RETURNS myRowTyp;ALTER MODULE myMod PUBLISHALTER MODULE
12、myMod PUBLISH PROCEDURE myProc(OUT param1 ANCHOR myTab.col2);PROCEDURE myProc(OUT param1 ANCHOR myTab.col2);-17-模块模块-实现实现(Module Implementation)(Module Implementation)下面的代码是模块的实现部分:下面的代码是模块的实现部分:ALTERALTER MODULEMODULE myModmyMod ADD VARIABLEADD VARIABLE pkgVarpkgVar ANCHORANCHOR myTab.col1;myTab.co
13、l1;ALTERALTER MODULEMODULE myModmyMod ADDADD FUNCTION FUNCTION myFunc(val1myFunc(val1 ANCHORANCHOR myTab.col1)myTab.col1)RETURNSRETURNS myRowTypmyRowTypBEGINBEGIN DECLARE DECLARE var1var1 myRowTyp;myRowTyp;SELECT SELECT *INTOINTO var1 var1 FROMFROM myTab myTab WHEREWHERE col1col1 col1 pkgVar;pkgVar;
14、RETURNRETURN var1;var1;ENDENDALTERALTER MODULEMODULE myModmyMod ADDADD PROCEDURE PROCEDURE myProc(myProc(OUTOUT param1param1 ANCHORANCHOR myTab.col2)myTab.col2)BEGINBEGIN DECLARE DECLARE varRowvarRow myRowTyp;myRowTyp;SETSET param1param1 =varRow.col2varRow.col2 pkgVar;pkgVar;ENDEND-18-模块模块-其他语句其他语句删
15、除整个模块删除整个模块DROP MODULE myMod;DROP MODULE myMod;保留规格说明内容,删除实现保留规格说明内容,删除实现ALTER MODULE myMod DROP BODY;ALTER MODULE myMod DROP BODY;删除模块中的存储过程删除模块中的存储过程(SP)(SP)ALTER MODULE myMod DROP PROCEDURE myProc;ALTER MODULE myMod DROP PROCEDURE myProc;将模块的执行权限赋给将模块的执行权限赋给joejoeGRANT EXECUTE ON MODULE myMod TO
16、joe;GRANT EXECUTE ON MODULE myMod TO joe;-19-主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程-20-IF IF语句语句格式:格式:IF IF 条件1 THENTHEN statement1;statement1;ELSEIFELSEIF 条件2 THENTHEN statement2;statement2;ELSEELSE statement3;statement3;
17、END END IF;IF;注注:条件成立时为条件成立时为TRUE(TRUE(真真),),不成立时为不成立时为FALSE(FALSE(假假)和和 NULLNULL-21-IF IF语句例子语句例子IF IF ratingrating =1 1 THENTHENUPDATEUPDATE EMPLOYEE SETEMPLOYEE SET salarysalary =salary*1.10salary*1.10 WHEREWHERE empnoempno =i_num;i_num;(如果满足于(如果满足于.时,薪水调整时,薪水调整1.11.1倍)倍)ELSEIFELSEIF ratingrating
18、 =2 2 THENTHENUPDATEUPDATE EMPLOYEE SETEMPLOYEE SET salarysalary =salary*1.05salary*1.05 WHEREWHERE empnoempno =i_num;i_num;ELSEELSEUPDATEUPDATE EMPLOYEE SETEMPLOYEE SET salarysalary =salary*1.03salary*1.03 WHEREWHERE empnoempno =i_num;i_num;ENDEND IF;IF;-22-CASECASE语句(语句(1 of 21 of 2)简单简单CASECASE语句
19、语句-23-CASECASE语句(语句(2 of 22 of 2)稍加变形的稍加变形的CASECASE语句语句-24-LOOPLOOP语句语句语法语法LABEL LOOPLABEL LOOP SQL-procedure-statements;SQL-procedure-statements;END END LOOP LABEL;LOOP LABEL;示例示例fetch_loop:LOOPfetch_loop:LOOPFETCH c1 INTO v_firstname,v_lastname;c1 INTO v_firstname,v_lastname;SET counter =counter +
20、1;SET counter =counter +1;IF counter =51 THEN IF counter =51 THEN LEAVE fetch_loop;LEAVE fetch_loop;END IF;END IF;ENDEND LOOP fetch_loop;LOOP fetch_loop;标签关关键字字-25-FORFOR语句语句语法语法LABEL FOR for-loop-name AS cursor-name CURSOR FORLABEL FOR for-loop-name AS cursor-name CURSOR FOR select-statement select
21、-statement DODO SQL-procedure-statements;SQL-procedure-statements;END END FOR LABEL;LABEL;示例示例DECLARE fullname CHAR(40);DECLARE fullname CHAR(40);FOR v1 AS c1 CURSOR FOR FOR v1 AS c1 CURSOR FOR SELECT firstnme,midinit,lastname FROM employeeSELECT firstnme,midinit,lastname FROM employeeDODO SET fulln
22、ame=lastname|,|firstnme|,|midinit;SET fullname=lastname|,|firstnme|,|midinit;INSERT INTO tname VALUE (fullname);INSERT INTO tname VALUE (fullname);END FOR;END FOR;-26-其他控制语句其他控制语句REPEATREPEAT语句语句ftch_loop2:ftch_loop2:REPEATREPEAT FETCH c1 INTO v_firstname,v_midinit,v_lastname;FETCH c1 INTO v_firstna
23、me,v_midinit,v_lastname;UNTIL SQLCODE 0 AND REPEAT ftch_loop2;UNTIL SQLCODE 0 AND REPEAT ftch_loop2;WHILEWHILE语句语句WHILE at_end =0 DOWHILE at_end =0 DO FETCH c1 INTO v_firstname,v_midinit,v_lastname;FETCH c1 INTO v_firstname,v_midinit,v_lastname;IF SQLCODE =100 THEN IF SQLCODE =100 THEN SET at_end =1
24、;SET at_end =1;END IF;END IF;END WHILE;END WHILE;-27-LEAVELEAVE和和ITERATEITERATE语句语句LEAVELEAVE和和ITERATEITERATE语句来控制循环语句来控制循环LEAVELEAVE语句用来跳出循环语句用来跳出循环ITERATEITERATE语句用来回到语句用来回到forfor或者或者whilewhile循环的开始重新执行循环的开始重新执行示例示例FETCH_LOOP1:LOOPFETCH_LOOP1:LOOP FETCH c1 INTO v_dept,v_deptname,v_admdept;FETCH c1
25、 INTO v_dept,v_deptname,v_admdept;IF at_end =1 THEN IF at_end =1 THEN LEAVE FETCH_LOOP1;LEAVE FETCH_LOOP1;ELSEIF v_dept =D01 THEN ELSEIF v_dept =D01 THEN ITERATE FETCH_LOOP1;ITERATE FETCH_LOOP1;END IF;END IF;INSERT INTO department(deptno,deptname,admdept)INSERT INTO department(deptno,deptname,admdep
26、t)VALUES(NEW,v_deptname,v_admdept);VALUES(NEW,v_deptname,v_admdept);END LOOP FETCH_LOOP1;END LOOP FETCH_LOOP1;-28-GOTOGOTO语句语句GOTOGOTO语句用于直接跳转到指定标签处。例如:语句用于直接跳转到指定标签处。例如:IF v_DEPT =D11IF v_DEPT =D11 GOTO bye;GOTO bye;bye:bye:-29-RETURNRETURN语句语句RETURNRETURN语句用于向调用返回。语句用于向调用返回。IF v_DEPT =D11IF v_DEPT
27、 =D11 RETURN 1;RETURN 1;-30-主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程-31-游标的声明游标的声明下面是游标声明的几个例子:下面是游标声明的几个例子:1.1.DECLARE c1 CURSOR FOR select*from staff;DECLARE c1 CURSOR FOR select*from staff;2.2.(DECLAREDECLARE关键字,关键字,clcl游
28、标名称,游标名称,CURSORCURSOR是必须有的,;指通过是必须有的,;指通过c1c1的游标来操作的游标来操作staffstaff里所有的数据)最常里所有的数据)最常用的最普通的。用的最普通的。3.3.2.DECLARE c1 CURSOR WITH HOLD FOR select *form 2.DECLARE c1 CURSOR WITH HOLD FOR select *form staff;staff;4.4.3.DECLARE c1 CURSOR WITH RETURN TO CALLER FOR 3.DECLARE c1 CURSOR WITH RETURN TO CALLER
29、 FOR select *form staff;select *form staff;5.5.4.DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR 4.DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR select *form staff;select *form staff;-32-游标的相关操作游标的相关操作打开游标打开游标OPEN OPEN 提取游标提取游标FETCH FETCH INTO INTO 关闭游标关闭游标CLOSE CLOSE -33-游标的遍历游标的遍历DECLARE at_end INT DEFA
30、ULT 0;DECLARE at_end INT DEFAULT 0;(声明了(声明了at_endat_end的变量,默认值是的变量,默认值是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_found not_found CONDITION CONDITIONFORFORSQLSTATESQLSTATE02000;02000;DECLARE c1 C
31、URSOR FOR SELECT IID FROM YH;DECLARE c1 CURSOR FOR SELECT IID FROM YH;(声明了一个游标,把声明了一个游标,把IIDIID的指标拿出来)的指标拿出来)DECLARE CONTINUE HANDLER FOR not_found SET at_end =1;DECLARE CONTINUE HANDLER FOR not_found SET at_end =1;OPENOPENc1;c1;(进行循环)(进行循环)SET PCOUNT =0;SET PCOUNT =0;ins_loop:LOOPins_loop:LOOP FETC
32、H c1 INTO PIID;FETCH c1 INTO PIID;IF IF at_endat_end 0 THEN 0 THEN LEAVE ins_loop;LEAVE ins_loop;(LEAVELEAVE跳出循环)跳出循环)END IF;END IF;SET PCOUNT =PCOUNT +1;SET PCOUNT =PCOUNT +1;(表示提取了多少条记录)(表示提取了多少条记录)END LOOP;END LOOP;-34-删除游标对应的数据行删除游标对应的数据行DECLAREDECLARE cursor1cursor1 CURSORCURSOR FOR FOR SELECTS
33、ELECT DEPTNO,DEPTNO,DEPTNAME,DEPTNAME,LOCATIONLOCATION FROMFROM DB2ADMIN.ORG FORDB2ADMIN.ORG FOR UPDATE;UPDATE;(声明一个声明一个cursor1cursor1的游标,从一的游标,从一个表时提出部门名称,个表时提出部门名称,.,位置),位置)OPENOPEN cursor1;cursor1;(打开游标)(打开游标)FETCHFETCH FROMFROM cursor1cursor1 INTOINTO v_DEPTNO,v_DEPTNO,V_DEPTNAME,v_LOCATION;V_DE
34、PTNAME,v_LOCATION;DELETE FROM DB2ADMIN.ORG WHERE CURRENT OF cursor1;DELETE FROM DB2ADMIN.ORG WHERE CURRENT OF cursor1;(删除删除DB2ADMIN.ORGDB2ADMIN.ORG的记录;的记录;CURRENT OF cursor1CURRENT OF cursor1这是的游标是指向某一个位置;删除游标指向的当前行。)这是的游标是指向某一个位置;删除游标指向的当前行。)CLOSE cursor1;CLOSE cursor1;(关闭游标,也可做一个循环,删除所有的内容关闭游标,也可做
35、一个循环,删除所有的内容)-35-更新游标对应的数据行更新游标对应的数据行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_DEPTNO,v_DEPTNO,v_DEPTN
36、AME,v_LOCATION;v_DEPTNAME,v_LOCATION;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-使用游标返回多个结果集使用游标返回多个结果集动态的的结果集两个果集两个处于打开的状于打开的状态?-37-主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基
37、础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程-38-异常处理器的声明异常处理器的声明DECLARE handler-type HANDLER FOR condition handler-action;DECLARE handler-type HANDLER FOR condition handler-action;(语法结构)(异常处理器是需要预先声明的)(语法结构)(异常处理器是需要预先声明的)-39-异常处理器的类型(异常处理器的类型(handler-typehandler-type)异常处理
38、器的类型有如下几种:异常处理器的类型有如下几种:CONTINUECONTINUE(继续继续)在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。EXITEXIT(记录完后就退出,不再继续执行记录完后就退出,不再继续执行)在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。UNDOUNDO(撤销所做的记录,退出整个程序撤销所做的记录,退出整个程序)在异常处理器操作执行之前,在异常处理器操作执行之前,DB2DB2会回滚存储过程中执行的会
39、回滚存储过程中执行的SQLSQL操作。在异常处理器操作。在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。操作完成之后,存储过程会终止,并将控制返回给调用者。-40-异常处理器和异常处理器和SQLSTATESQLSTATE 异常处理器可以处理基于特定异常处理器可以处理基于特定SQLSTATESQLSTATE值的定制异常,或者处理预定值的定制异常,或者处理预定义异常的类。预定义的义异常的类。预定义的3 3种异常如下所示:种异常如下所示:NOT FOUNDNOT FOUND标识导致标识导致SQLCODESQLCODE值为值为100100或者或者SQLSATESQLSATE值为值为02
40、00002000的异常。这个异常通的异常。这个异常通常在常在SELECTSELECT没有返回行的时候出现。没有返回行的时候出现。SQLEXCEPTIONSQLEXCEPTION标识导致标识导致SQLCODESQLCODE值为负的异常。值为负的异常。SQLWARNINGSQLWARNING标识导致警告异常或者导致标识导致警告异常或者导致100100以外的以外的SQLCODESQLCODE正值的异常。正值的异常。注注:如果产生了如果产生了NOT FOUND NOT FOUND 或者或者SQLWARNINGSQLWARNING异常,并且没有为这个异常定义异常处理器,异常,并且没有为这个异常定义异常处
41、理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTIONSQLEXCEPTION异常,异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。者。-41-异常处理器示例异常处理器示例 如下示例声明了两个异常处理器。如下示例声明了两个异常处理器。EXITEXIT处理器会在出现处理器会在出现SQLEXCEPTION SQLEXCEPTION 或者或者SQLWARNINGSQLWARNING异常的时
42、候被调用。异常的时候被调用。EXITEXIT处理器会在终止处理器会在终止SQLSQL程序之前,将名为程序之前,将名为stmtstmt的变量设为的变量设为“ABORTED”,“ABORTED”,并且将控制流返回给调用者。并且将控制流返回给调用者。UNDOUNDO处理器会将处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的控制流返回给调用者之前,回滚存储过程体中已经完成的SQLSQL操作。操作。DECLARE EXIT HANDLER FOR SQLEXCEPTION,SQLWARNING DECLARE EXIT HANDLER FOR SQLEXCEPTION,SQLWARNING
43、SET stmt=ABORTED;SET stmt=ABORTED;DECLARE UNDO HANDLER FOR NOT FOUND;DECLARE UNDO HANDLER FOR NOT FOUND;-42-异常处理器定制异常处理器定制 如果预定义异常集不能满足需求,就可以为特定的如果预定义异常集不能满足需求,就可以为特定的SQLSTATESQLSTATE值声明定值声明定制异常,然后再为这个定制异常声明处理器。语法如下:制异常,然后再为这个定制异常声明处理器。语法如下:DECLARE unique-name CONDITION FOR SQLSATE sqlstate DECLARE
44、unique-name CONDITION FOR SQLSATE sqlstate-43-更为复杂的异常处理器示例(更为复杂的异常处理器示例(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 -Capture SQLCODE&SQLS
45、TATE -Capture SQLCODE&SQLSTATE SELECT SQLCODE,SQLSTATE SELECT SQLCODE,SQLSTATE INTO hSqlcode,hSqlstate INTO hSqlcode,hSqlstate FROM SYSIBM.SYSDUMMY1;FROM SYSIBM.SYSDUMMY1;-Use the poGenStatus variable to tell the procedure-what type of error occurred -Use the poGenStatus variable to tell the procedu
46、re-what type of error occurred CASE hSqlstate CASE hSqlstate WHEN 02000 THEN WHEN 02000 THEN SET poGenStatus=5000;SET poGenStatus=5000;WHEN 42724 THEN WHEN 42724 THEN SET poGenStatus=3;SET poGenStatus=3;ELSE IF(hSqlCode 0)THEN ELSE IF(hSqlCode 0)THEN SET poGenStatus=hSqlCode;SET poGenStatus=hSqlCode
47、;END IF;END IF;END END-44-更为复杂的异常处理器示例(更为复杂的异常处理器示例(2 of 22 of 2)上面的异常处理器会在出现上面的异常处理器会在出现SQLEXCEPTION,SQLWARNING,NOT SQLEXCEPTION,SQLWARNING,NOT FOUNDFOUND异常的时候触发。异常处理器会取出当前的异常的时候触发。异常处理器会取出当前的SQLCODE,SQLCODE,SQLSTATESQLSTATE,然后根据它们的值来设置输出参数(,然后根据它们的值来设置输出参数(poGenStatuspoGenStatus)的值。)的值。-45-主要内容:主要
48、内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程-46-使用使用ODSODS开发存储过程的基本步骤开发存储过程的基本步骤创建存储过程创建存储过程将存储过程部署到本地或远程将存储过程部署到本地或远程DB2DB2数据库数据库修改并重新部署存储过程修改并重新部署存储过程对存储过程进行测试和对存储过程进行测试和DebugDebug-47-启动启动ODS-48-ODS工作台工作台-49-创建数据库连接创建数据库连接(1 of 2)-50
49、-创建数据库连接创建数据库连接(2 of 2)-51-创建一个新的项目创建一个新的项目(1 of 3)-52-创建一个新的项目创建一个新的项目(2 of 3)-53-创建一个新的项目创建一个新的项目(3 of 3)-54-新建一个存储过程新建一个存储过程-55-指定使用语言类型指定使用语言类型-56-设定存储过程使用的设定存储过程使用的SQL语句语句-57-设定设定SQL语句的类型和构建方式语句的类型和构建方式-58-SQL语句构造器语句构造器-59-选择用于构造选择用于构造SQL语句的对象语句的对象-60-调整调整SQL语句语句-61-运行调整后的运行调整后的SQL语句语句-62-设定存储过
50、程入口参数设定存储过程入口参数-63-部署和是否激活部署和是否激活debugging选项选项-64-代码片段代码片段-65-总结总结-66-存储过程部署存储过程部署-67-部署选项部署选项-68-例程选项例程选项-69-例程部署总结例程部署总结-70-部署完成界面部署完成界面-71-Copyright IBM Corporation 2009运行存储过程运行存储过程-72-Copyright IBM Corporation 2009使用使用Command Editor创建存储过程(创建存储过程(1 of 3)-73-Copyright IBM Corporation 2009使用使用Comma