《[精选]db2数据库存储过程.pptx》由会员分享,可在线阅读,更多相关《[精选]db2数据库存储过程.pptx(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、DB2DB2数据库中的存储过程数据库中的存储过程主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程什么是存储过程?什么是存储过程?Stored ProcedureStored Procedure受受 DB2 DB2 效劳器控制的一段可执行程序效劳器控制的一段可执行程序可以通过可以通过SQLSQL的的CALLCALL语句来完成对存储过程的调用语句来完成对存储过程的调用在存储过程中可以包含业务逻辑在存储过程中可以包含业
2、务逻辑存储过程可以在本地或远程进行调用存储过程可以在本地或远程进行调用存储过程可以接收或传递参数,生成结果集存储过程可以接收或传递参数,生成结果集什么时候使用存储过程?什么时候使用存储过程?使用存储过程的适宜时机使用存储过程的适宜时机:应用程序的性能无法满足预期时应用程序的性能无法满足预期时客户端数量较多且应用程序中客户端数量较多且应用程序中SQLSQL代码分散时代码分散时应用程序需要进行繁重的数据库操作,同时这些操作并不应用程序需要进行繁重的数据库操作,同时这些操作并不需要进行太多的客户交互需要进行太多的客户交互应用程序代码更改频繁应用程序代码更改频繁需要对客户应用代码进行访问控制时需要对客
3、户应用代码进行访问控制时客户应用需要在一次操作中执行多条客户应用需要在一次操作中执行多条 SQL SQL 语句语句C/S:C/S:宏观交互图宏观交互图主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程存储过程结构存储过程结构CREATE OR REPLACE PROCEDURE CREATE OR REPLACE PROCEDURE IN|OUT|INOUT IN|OUT|INOUT 参数名参数名 数据类型数据类型
4、 默认值默认值 LANGUAGE SQLLANGUAGE SQLBEGINBEGIN 业务逻辑代码业务逻辑代码END;END;参数类型参数类型ININ输入参数输入参数只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说,只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说,对于存储过程而言它是只读的。对于存储过程而言它是只读的。OUTOUT输出参数输出参数在存储过程结束时向调用者返回。一般在过程中都会被赋值。在存储过程结束时向调用者返回。一般在过程中都会被赋值。INOUTINOUT输入输出参数输入输出参数上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另
5、外它上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另外它也能够作为输出参数被修改和赋值。也能够作为输出参数被修改和赋值。复合语句复合语句 复合语句是指包含在复合语句是指包含在BEGINBEGIN和和ENDEND间的语句。它一间的语句。它一般包括如下语句类型:般包括如下语句类型:声明语句声明语句赋值语句赋值语句控制语句控制语句条件处理语句条件处理语句复合语句例如复合语句例如说明:说明:1.1.复合语句可以嵌套使用。复合语句可以嵌套使用。2.BEGIN2.BEGIN语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。声明
6、语句声明语句变量声明变量声明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 CURSOR FOR select *from staff;DECLARE c1 CURSOR FOR select *from staff;异常处理器声明异常处理器声明DECLARE EXIT H
7、ANDLER FOR SQLEXCEPTION ;DECLARE EXIT HANDLER FOR SQLEXCEPTION ;赋值语句赋值语句语法语法SET lv_name =expression;SET lv_name =expression;SET lv_name =NULL;SET lv_name =NULL;例如例如1 1 SET salary =salary +salary *0.1;SET salary =salary +salary *0.1;2 2 SET init_salary =NULL;SET init_salary =NULL;3 3 SET salary =SET
8、salary =select salary from employee where empno =select salary from employee where empno =lv_emp_numlv_emp_num;注注:如果如果 SELECT SELECT 语句返回记录超过一行,例如语句返回记录超过一行,例如 3 3 将会返回将会返回SQLERRORSQLERROR。存储过程例子存储过程例子嵌套存储过程例子嵌套存储过程例子模块模块ModuleModule模块是如下几种对象的集合:模块是如下几种对象的集合:SPSP,UDFUDF,global variables and cursorsg
9、lobal variables and cursors,typestypes,conditionsconditions模块的主要优势:模块的主要优势:结构良好,便于组织结构良好,便于组织范围限定范围限定CALL mySchema.myModule.myProcCALL mySchema.myModule.myProc信息隐藏信息隐藏每个对象都可以是每个对象都可以是 public public 或或 privateprivate权限控制权限控制可以模块为单位,而不是以模块中的对象为单位来控制权限可以模块为单位,而不是以模块中的对象为单位来控制权限模块模块-规格说明规格说明Module Speci
10、ficationModule Specification模块可以发布模块可以发布type,SP,UDFtype,SP,UDF以供外部使用。以供外部使用。CREATE OR REPLACE MODULE myMod;CREATE OR REPLACE MODULE myMod;ALTER MODULE myMod PUBLISHALTER MODULE myMod PUBLISH TYPE myRowTyp AS ANCHOR ROW myTab;TYPE myRowTyp AS ANCHOR ROW myTab;ALTER MODULE myMod PUBLISHALTER MODULE my
11、Mod PUBLISH FUNCTION myFunc FUNCTION myFuncval1 ANCHOR myTab.col1val1 ANCHOR myTab.col1 RETURNS myRowTyp;RETURNS myRowTyp;ALTER MODULE myMod PUBLISHALTER MODULE myMod PUBLISH PROCEDURE myProc PROCEDURE myProcOUT param1 ANCHOR myTab.col2OUT param1 ANCHOR myTab.col2;模块模块-实现实现Module ImplementationModul
12、e Implementation下面的代码是模块的实现局部:下面的代码是模块的实现局部:ALTER MODULE myMod ADD VARIABLE pkgVar ANCHOR myTab.col1;ALTER MODULE myMod ADD VARIABLE pkgVar ANCHOR myTab.col1;ALTER MODULE myMod ADD FUNCTION ALTER MODULE myMod ADD FUNCTION myFuncmyFuncval1 ANCHOR myTab.col1val1 ANCHOR myTab.col1 RETURNS myRowTyp RETU
13、RNS myRowTypBEGINBEGIN DECLARE var1 myRowTyp;DECLARE var1 myRowTyp;SELECT *INTO var1 FROM myTab WHERE col1 pkgVar;SELECT *INTO var1 FROM myTab WHERE col1 pkgVar;RETURN var1;RETURN var1;ENDENDALTER MODULE myMod ADD PROCEDURE myProcALTER MODULE myMod ADD PROCEDURE myProcOUT param1 ANCHOR myTab.col2OUT
14、 param1 ANCHOR myTab.col2BEGINBEGIN DECLARE varRow myRowTyp;DECLARE varRow myRowTyp;SET param1 =varRow.col2 pkgVar;SET param1 =varRow.col2 pkgVar;ENDEND模块模块-其他语句其他语句删除整个模块删除整个模块DROP MODULE myMod;DROP MODULE myMod;保存规格说明内容,删除实现保存规格说明内容,删除实现ALTER MODULE myMod DROP BODY;ALTER MODULE myMod DROP BODY;删除模
15、块中的存储过程删除模块中的存储过程SPSPALTER MODULE myMod DROP PROCEDURE myProc;ALTER MODULE myMod DROP PROCEDURE myProc;将模块的执行权限赋给将模块的执行权限赋给joejoeGRANT EXECUTE ON MODULE myMod TO joe;GRANT EXECUTE ON MODULE myMod TO joe;主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、
16、编写和调试存储过程、编写和调试存储过程IF IF语句语句格式:格式:IF IF 条件1 THENTHEN statement1;statement1;ELSEIFELSEIF 条件2 THENTHEN statement2;statement2;ELSEELSE statement3;statement3;END END IF;IF;注注:条件成立时为条件成立时为TRUE TRUE 真真,不成立时为不成立时为FALSEFALSE假假 和和 NULLNULLIF IF语句例子语句例子IF IF ratingrating =1 1 THENTHENUPDATEUPDATE EMPLOYEE SET
17、EMPLOYEE SET salarysalary =salary*1.10salary*1.10 WHEREWHERE empnoempno =i_num;i_num;如果满足于如果满足于.时,薪水调整时,薪水调整1.11.1倍倍ELSEIFELSEIF ratingrating =2 2 THENTHENUPDATEUPDATE EMPLOYEE SETEMPLOYEE SET salarysalary =salary*1.05salary*1.05 WHEREWHERE empnoempno =i_num;i_num;ELSEELSEUPDATEUPDATE EMPLOYEE SETEM
18、PLOYEE SET salarysalary =salary*1.03salary*1.03 WHEREWHERE empnoempno =i_num;i_num;ENDEND IF;IF;CASECASE语句语句1 of 21 of 2简单简单CASECASE语句语句CASECASE语句语句2 of 22 of 2稍加变形的稍加变形的CASECASE语句语句LOOPLOOP语句语句语法语法LABEL LOOPLABEL LOOP SQL-procedure-statements;SQL-procedure-statements;END END LOOP LABEL;LOOP LABEL;例
19、如例如fetch_loop:LOOPfetch_loop:LOOPFETCH c1 INTO v_firstname,v_lastname;c1 INTO v_firstname,v_lastname;SET counter =counter +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;标签关关键字字FORFOR语句语句语法语法LAB
20、EL 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 fullname CHARDECLARE fullname CHAR4040;FOR v1 AS c1 CURSOR FOR SELECT firstnme,
21、midinit,lastname FROM employeeFOR v1 AS c1 CURSOR FOR SELECT firstnme,midinit,lastname FROM employeeDODO SET fullname=lastname|,|firstnme|,|midinit;SET fullname=lastname|,|firstnme|,|midinit;INSERT INTO tname VALUE INSERT INTO tname VALUE fullnamefullname;END FOR;END FOR;其他控制语句其他控制语句REPEATREPEAT语句语句
22、ftch_loop2:ftch_loop2:REPEATREPEAT FETCH c1 INTO v_firstname,v_midinit,v_lastname;FETCH c1 INTO v_firstname,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_lastna
23、me;FETCH c1 INTO v_firstname,v_midinit,v_lastname;IF SQLCODE =100 THEN IF SQLCODE =100 THEN SET at_end =1;SET at_end =1;END IF;END IF;END WHILE;END WHILE;LEAVELEAVE和和ITERATEITERATE语句语句LEAVELEAVE和和ITERATEITERATE语句来控制循环语句来控制循环LEAVELEAVE语句用来跳出循环语句用来跳出循环ITERATEITERATE语句用来回到语句用来回到forfor或者或者whilewhile循环的开
24、始重新执行循环的开始重新执行例如例如FETCH_LOOP1:LOOPFETCH_LOOP1:LOOP FETCH c1 INTO v_dept,v_deptname,v_admdept;FETCH c1 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 I
25、F;END IF;INSERT INTO department INSERT INTO departmentdeptno,deptname,admdeptdeptno,deptname,admdept VALUES VALUESNEW,v_deptname,v_admdeptNEW,v_deptname,v_admdept;END LOOP FETCH_LOOP1;END LOOP FETCH_LOOP1;GOTOGOTO语句语句GOTOGOTO语句用于直接跳转到指定标签处。例如:语句用于直接跳转到指定标签处。例如:IF v_DEPT =D11IF v_DEPT =D11 GOTO bye;G
26、OTO bye;bye:bye:RETURNRETURN语句语句RETURNRETURN语句用于向调用返回。语句用于向调用返回。IF v_DEPT =D11IF v_DEPT =D11 RETURN 1;RETURN 1;主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程游标的声明游标的声明下面是游标声明的几个例子:下面是游标声明的几个例子:1.1.DECLARE c1 CURSOR FOR select*from
27、 staff;DECLARE c1 CURSOR FOR select*from staff;2.2.DECLAREDECLARE关键字,关键字,clcl游标名称,游标名称,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 c
28、1 CURSOR WITH RETURN TO CALLER FOR 3.DECLARE c1 CURSOR WITH RETURN TO CALLER 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;游标的相关操作游标的相关操作翻开游标翻开游标OPEN OPEN 提取游标提取游标FETCH F
29、ETCH INTO INTO 关闭游标关闭游标CLOSE CLOSE 游标的遍历游标的遍历DECLARE at_end INT DEFAULT 0;DECLARE at_end INT DEFAULT 0;声明了声明了at_endat_end的变量,默认值是的变量,默认值是0 0DECLARE PIID INTEGER DEFAULT 0;DECLARE PIID INTEGER DEFAULT 0;DECLARE PINT INTEGER DEFAULT 0;DECLARE PINT INTEGER DEFAULT 0;DECLARE not_found CONDITIONDECLARE n
30、ot_found CONDITIONFORFORSQLSTATESQLSTATE02000;02000;DECLARE c1 CURSOR 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;进行循环进行循环SE
31、T PCOUNT =0;SET PCOUNT =0;ins_loop:LOOPins_loop:LOOP FETCH c1 INTO PIID;FETCH c1 INTO PIID;IF at_end 0 THEN IF at_end 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;删除游标对应的数据行删除游标对应的数据行DECLARE cu
32、rsor1 CURSOR FOR DECLARE cursor1 CURSOR FOR SELECT DEPTNO,DEPTNAME,LOCATIONSELECT DEPTNO,DEPTNAME,LOCATION FROM DB2ADMIN.ORG FOR UPDATE;FROM DB2ADMIN.ORG FOR UPDATE;声明一个声明一个cursor1cursor1的游标,从一的游标,从一个表时提出部门名称,个表时提出部门名称,.,位置,位置OPEN cursor1;OPEN cursor1;翻开游标翻开游标FETCH FROM cursor1 INTO v_DEPTNO,V_DEPTN
33、AME,v_LOCATION;FETCH FROM cursor1 INTO v_DEPTNO,V_DEPTNAME,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 cu
34、rsor1;CLOSE cursor1;关闭游标,也可做一个循环,删除所有的内容关闭游标,也可做一个循环,删除所有的内容更新游标对应的数据行更新游标对应的数据行DECLARE cursor1 CURSOR FOR DECLARE cursor1 CURSOR FOR SELECT DEPTNO,DEPTNAME,LOCATIONSELECT DEPTNO,DEPTNAME,LOCATION FROM DB2ADMIN.ORG FROM DB2ADMIN.ORG FOR UPDATE;FOR UPDATE;OPEN cursor1;OPEN cursor1;FETCH FROM cursor1
35、INTO v_DEPTNO,v_DEPTNAME,v_LOCATION;FETCH FROM cursor1 INTO v_DEPTNO,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、?主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程异常处理器的声明异常处理器的声明DECLARE handler-type HANDLER FOR condition handler-action;DECLARE handler-type HANDLER FOR condition handler-action;语法结构异常处理器是需要预先声明的语法结构异常处理器是需要预先声明的异常处理器的类型异常处理器的类型h
37、andler-typehandler-type异常处理器的类型有如下几种:异常处理器的类型有如下几种:CONTINUECONTINUE继续继续在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。EXITEXIT记录完后就退出,不再继续执行记录完后就退出,不再继续执行在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。UNDOUNDO撤销所做的记录,退出整个程序撤销所做的记录,退出整个程序在异常处理器操作执行之前,在异常处理器操作执行
38、之前,DB2DB2会回滚存储过程中执行的会回滚存储过程中执行的SQLSQL操作。在异常处理器操作。在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。操作完成之后,存储过程会终止,并将控制返回给调用者。异常处理器和异常处理器和SQLSTATESQLSTATE 异常处理器可以处理基于特定异常处理器可以处理基于特定SQLSTATESQLSTATE值的定制异常,或者处理预定值的定制异常,或者处理预定义异常的类。预定义的义异常的类。预定义的3 3种异常如下所示:种异常如下所示:NOT FOUNDNOT FOUND标识导致标识导致SQLCODESQLCODE值为值为100100或者或者SQL
39、SATESQLSATE值为值为0200002000的异常。这个异常通的异常。这个异常通常在常在SELECTSELECT没有返回行的时候出现。没有返回行的时候出现。SQLEXCEPTIONSQLEXCEPTION标识导致标识导致SQLCODESQLCODE值为负的异常。值为负的异常。SQLWARNINGSQLWARNING标识导致警告异常或者导致标识导致警告异常或者导致100100以外的以外的SQLCODESQLCODE正值的异常。正值的异常。注注:如果产生了如果产生了NOT FOUND NOT FOUND 或者或者SQLWARNINGSQLWARNING异常,并且没有为这个异常定义异常处理器,
40、异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTIONSQLEXCEPTION异常,异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。者。异常处理器例如异常处理器例如 如下例如声明了两个异常处理器。如下例如声明了两个异常处理器。EXITEXIT处理器会在出现处理器会在出现SQLEXCEPTION SQLEXCEPTION 或者或者SQLWARNINGS
41、QLWARNING异常的时候被调用。异常的时候被调用。EXITEXIT处理器会在终止处理器会在终止SQLSQL程序之前,将名为程序之前,将名为stmtstmt的变量设为的变量设为“ABORTED“ABORTED,并且将控制流返回给调用者。并且将控制流返回给调用者。UNDOUNDO处理器会将处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的控制流返回给调用者之前,回滚存储过程体中已经完成的SQLSQL操作。操作。DECLARE EXIT HANDLER FOR SQLEXCEPTION,SQLWARNING DECLARE EXIT HANDLER FOR SQLEXCEPTION,S
42、QLWARNING SET stmt=ABORTED;SET stmt=ABORTED;DECLARE UNDO HANDLER FOR NOT FOUND;DECLARE UNDO HANDLER FOR NOT FOUND;异常处理器定制异常处理器定制 如果预定义异常集不能满足需求,就可以为特定的如果预定义异常集不能满足需求,就可以为特定的SQLSTATESQLSTATE值声明定值声明定制异常,然后再为这个定制异常声明处理器。语法如下:制异常,然后再为这个定制异常声明处理器。语法如下:DECLARE unique-name CONDITION FOR SQLSATE sqlstate DE
43、CLARE unique-name CONDITION FOR SQLSATE sqlstate 更为复杂的异常处理器例如更为复杂的异常处理器例如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&SQL
44、STATE -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 proced
45、ure-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 ELSE IF hSqlCode 0hSqlCode 0 THEN THEN SET poGenStatus=hSqlCode;SET poGenStatus=hSqlCode
46、;END IF;END IF;END END 更为复杂的异常处理器例如更为复杂的异常处理器例如2 of 22 of 2 上面的异常处理器会在出现上面的异常处理器会在出现SQLEXCEPTION,SQLWARNING,NOT SQLEXCEPTION,SQLWARNING,NOT FOUNDFOUND异常的时候触发。异常处理器会取出当前的异常的时候触发。异常处理器会取出当前的SQLCODE,SQLCODE,SQLSTATESQLSTATE,然后根据它们的值来设置输出参数,然后根据它们的值来设置输出参数poGenStatuspoGenStatus的值。的值。主要内容:主要内容:1 1、存储过程介绍
47、、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程使用使用ODSODS开发存储过程的基本步骤开发存储过程的基本步骤创立存储过程创立存储过程将存储过程部署到本地或远程将存储过程部署到本地或远程DB2DB2数据库数据库修改并重新部署存储过程修改并重新部署存储过程对存储过程进行测试和对存储过程进行测试和DebugDebug启动启动ODSODS工作台工作台创立数据库连接创立数据库连接 1 of 2创立数据库连接创立数据库连接 2 of 2创立一个新的工程创立一个
48、新的工程 1 of 3创立一个新的工程创立一个新的工程 2 of 3创立一个新的工程创立一个新的工程 3 of 3新建一个存储过程新建一个存储过程指定使用语言类型指定使用语言类型设定存储过程使用的设定存储过程使用的SQL语句语句设定设定SQL语句的类型和构建方式语句的类型和构建方式SQL语句构造器语句构造器选择用于构造选择用于构造SQL语句的对象语句的对象调整调整SQL语句语句运行调整后的运行调整后的SQL语句语句设定存储过程入口参数设定存储过程入口参数部署和是否激活部署和是否激活debugging选项选项代码片段代码片段总结总结存储过程部署存储过程部署部署选项部署选项例程选项例程选项例程部署
49、总结例程部署总结部署完成界面部署完成界面 Copyright IBM Corporation 2023运行存储过程运行存储过程 Copyright IBM Corporation 2023使用使用 mand Editor创立存储过程创立存储过程1 of 3 Copyright IBM Corporation 2023使用使用 mand Editor创立存储过程创立存储过程2 of 3 Copyright IBM Corporation 2023使用使用 mand Editor创立存储过程创立存储过程3 of 3db2start;db2set DB2_ PATIBILITY_VECTOR=ORA
50、;db2stop;db2start;-CONNECT TO SAMPLE USER NMCCLUNG;-SET SQL PAT PLSQL;CREATE or REPLACE PROCEDURE DEM01 dateIs OUT DATE AS BEGIN SET dateIs :=SYSDATE;END DEM01 /SET SQL PAT DB2;CONNECT RESET;Open CLP激活激活PL/SQL Copyright IBM Corporation 2023使用命令行调用存储过程使用命令行调用存储过程1 of 6 Copyright IBM Corporation 2023使