db2数据库存储过程_第1页
db2数据库存储过程_第2页
db2数据库存储过程_第3页
db2数据库存储过程_第4页
db2数据库存储过程_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-1- 中国移动通信集团河南有限公司业务支援中中国移动通信集团河南有限公司业务支援中 心心 DB2DB2数据库中的存储过程数据库中的存储过程 -2- 主要内容:主要内容: 1 1、存储过程介绍、存储过程介绍 2 2、存储过程基础结构、存储过程基础结构 3 3、控制语句、控制语句 4 4、游标和结果集、游标和结果集 5 5、异常处理器、异常处理器 6 6、编写和调试存储过程、编写和调试存储过程 -3- 什么是存储过程?什么是存储过程?(Stored Procedure)(Stored Procedure) 受受 DB2 DB2 服务器控制的一段可执行程序服务器控制的一段可执行程序 可以通过可以通

2、过SQLSQL的的CALLCALL语句来完成对存储过程的调用语句来完成对存储过程的调用 在存储过程中可以包含业务逻辑在存储过程中可以包含业务逻辑 存储过程可以在本地或远程进行调用存储过程可以在本地或远程进行调用 存储过程可以接收或传递参数,生成结果集存储过程可以接收或传递参数,生成结果集 -4- 什么时候使用存储过程?什么时候使用存储过程? 使用存储过程的合适时机使用存储过程的合适时机: : 应用程序的应用程序的性能性能无法满足预期时无法满足预期时 客户端数量较多且应用程序中客户端数量较多且应用程序中SQLSQL代码分散时代码分散时 应用程序需要进行应用程序需要进行繁重繁重的数据库操作,同时这

3、些操作并不的数据库操作,同时这些操作并不 需要进行太多的客户交互需要进行太多的客户交互 应用程序代码更改频繁应用程序代码更改频繁 需要对客户应用代码进行访问控制时需要对客户应用代码进行访问控制时 客户应用需要在一次操作中执行多条客户应用需要在一次操作中执行多条 SQL SQL 语句语句 -5- C/S: C/S: 宏观交互图宏观交互图 -6- 主要内容:主要内容: 1 1、存储过程介绍、存储过程介绍 2 2、存储过程基础结构、存储过程基础结构 3 3、控制语句、控制语句 4 4、游标和结果集、游标和结果集 5 5、异常处理器、异常处理器 6 6、编写和调试存储过程、编写和调试存储过程 -7-

4、存储过程结构存储过程结构 CREATE OR REPLACE PROCEDURE CREATE OR REPLACE PROCEDURE ( IN | OUT | INOUT ( IN | OUT | INOUT 参数名参数名 数据类型数据类型 默认值默认值 ) ) LANGUAGE SQLLANGUAGE SQL BEGINBEGIN 业务逻辑代码业务逻辑代码 END;END; -8- 参数类型参数类型 ININ(输入参数)(输入参数) 只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说,只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说, 对于存储过程而言它

5、是只读的。对于存储过程而言它是只读的。 OUTOUT(输出参数)(输出参数) 在存储过程结束时向调用者返回。一般在过程中都会被赋值。在存储过程结束时向调用者返回。一般在过程中都会被赋值。 INOUTINOUT(输入输出参数)(输入输出参数) 上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另外它上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另外它 也能够作为输出参数被修改和赋值。也能够作为输出参数被修改和赋值。 -9- 复合语句复合语句 复合语句是指包含在复合语句是指包含在BEGINBEGIN和和ENDEND间的语句。它一间的语句。它一 般包括如下语句类型:般包括如下

6、语句类型: 声明语句声明语句 赋值语句赋值语句 控制语句控制语句 条件处理语句条件处理语句 -10- 复合语句示例复合语句示例 说明:说明: 1. 1. 复合语句可以嵌套使用。复合语句可以嵌套使用。 2. BEGIN2. BEGIN语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。 -11- 声明语句声明语句 变量声明变量声明 DECLARE my_var INTEGER DEFAULT 6;DECLARE my_var INTEGER DEFAULT 6; 条件声明条件声明 DECLARE not_found CONDITIO

7、N FOR SQLSTATE 02000;DECLARE not_found CONDITION FOR SQLSTATE 02000; 游标声明游标声明 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 lv_name = expressio

8、n;SET lv_name = expression; SET lv_name = NULL;SET lv_name = NULL; 示例示例 (1) SET salary = salary + salary (1) SET salary = salary + salary * * 0.1; 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 = (sel

9、ect salary from employee where empno = lv_emp_num); 注注: : 如果如果 SELECT SELECT 语句返回记录超过一行,示例语句返回记录超过一行,示例 3 3 将会返回将会返回SQLERRORSQLERROR。 -13- 存储过程例子存储过程例子 -14- 嵌套存储过程例子嵌套存储过程例子 -15- 模块模块(Module)(Module) 模块是如下几种对象的集合:模块是如下几种对象的集合: SPSP,UDFUDF,global variables and cursorsglobal variables and cursors,type

10、stypes,conditionsconditions 模块的主要优势:模块的主要优势: 结构良好,便于组织结构良好,便于组织 范围限定范围限定 CALL mySchema.myModule.myProc()CALL mySchema.myModule.myProc() 信息隐藏信息隐藏 每个对象都可以是每个对象都可以是 public public 或或 privateprivate 权限控制权限控制 可以模块为单位,而不是以模块中的对象为单位来控制权限可以模块为单位,而不是以模块中的对象为单位来控制权限 -16- 模块模块 - - 规格说明规格说明(Module Specification)

11、(Module 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

12、 myMod PUBLISH FUNCTION myFunc(val1 ANCHOR myTab.col1) FUNCTION myFunc(val1 ANCHOR myTab.col1) RETURNS myRowTyp; RETURNS myRowTyp; ALTER MODULE myMod PUBLISHALTER MODULE myMod PUBLISH PROCEDURE myProc(OUT param1 ANCHOR myTab.col2); PROCEDURE myProc(OUT param1 ANCHOR myTab.col2); -17- 模块模块 - - 实现实现(M

13、odule Implementation)(Module Implementation) 下面的代码是模块的实现部分:下面的代码是模块的实现部分: ALTERALTER MODULEMODULE myModmyMod ADD VARIABLEADD VARIABLE pkgVarpkgVar ANCHORANCHOR myTab.col1;myTab.col1; ALTERALTER MODULEMODULE myModmyMod ADDADD FUNCTION FUNCTION myFunc(val1myFunc(val1 ANCHORANCHOR myTab.col1) myTab.col

14、1) RETURNSRETURNS myRowTypmyRowTyp BEGINBEGIN DECLARE DECLARE var1var1 myRowTyp;myRowTyp; SELECT SELECT * * INTOINTO var1 var1 FROMFROM myTab myTab WHEREWHERE col1col1 col1 pkgVar;pkgVar; RETURNRETURN var1;var1; ENDEND ALTERALTER MODULEMODULE myModmyMod ADDADD PROCEDURE PROCEDURE myProc(myProc(OUTOU

15、T param1param1 ANCHORANCHOR myTab.col2)myTab.col2) BEGINBEGIN DECLARE DECLARE varRowvarRow myRowTyp;myRowTyp; SETSET param1param1 = = varRow.col2varRow.col2 pkgVar;pkgVar; ENDEND -18- 模块模块 - - 其他语句其他语句 删除整个模块删除整个模块 DROP MODULE myMod;DROP MODULE myMod; 保留规格说明内容,删除实现保留规格说明内容,删除实现 ALTER MODULE myMod DR

16、OP BODY;ALTER MODULE myMod DROP BODY; 删除模块中的存储过程删除模块中的存储过程(SP)(SP) ALTER MODULE myMod DROP PROCEDURE myProc;ALTER MODULE myMod DROP PROCEDURE myProc; 将模块的执行权限赋给将模块的执行权限赋给joejoe GRANT EXECUTE ON MODULE myMod TO joe;GRANT EXECUTE ON MODULE myMod TO joe; -19- 主要内容:主要内容: 1 1、存储过程介绍、存储过程介绍 2 2、存储过程基础结构、存

17、储过程基础结构 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; END END IF;IF; 注注: :条件成立时为条件成立时为TRUE (TRUE (真真), ),不成立时为不成立时为FALSE(FALSE(假假

18、) ) 和和 NULLNULL -21- IF IF语句例子语句例子 IF IF ratingrating = = 1 1 THENTHEN UPDATEUPDATE EMPLOYEE SETEMPLOYEE SET salarysalary = = salarysalary* *1.101.10 WHEREWHERE empnoempno = = i_num;i_num;(如果满足于(如果满足于.时,薪水调整时,薪水调整1.11.1倍)倍) ELSEIFELSEIF ratingrating = = 2 2 THENTHEN UPDATEUPDATE EMPLOYEE SETEMPLOYEE

19、 SET salarysalary = = salarysalary* *1.051.05 WHEREWHERE empnoempno = = i_num;i_num; ELSEELSE UPDATEUPDATE EMPLOYEE SETEMPLOYEE SET salarysalary = = salarysalary* *1.031.03 WHEREWHERE empnoempno = = i_num;i_num; ENDEND IF;IF; -22- CASECASE语句(语句(1 of 21 of 2) 简单简单CASECASE语句语句 -23- CASECASE语句(语句(2 of

20、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: LOOP FETCH c1 INTO v_firstname, v_lastname;c1 INTO v_firstname, v_lastname; SET counter = counter + 1; SET c

21、ounter = 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-state

22、ment select-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 e

23、mployee DODO SET fullname=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

24、_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_lastname; FETCH c1 INTO v_firstname, v_midinit, v_lastname; IF SQLCO

25、DE = 100 THEN IF SQLCODE = 100 THEN SET at_end = 1; SET at_end = 1; END IF; END IF; END WHILE;END WHILE; -27- LEAVELEAVE和和ITERATEITERATE语句语句 LEAVELEAVE和和ITERATEITERATE语句来控制循环语句来控制循环 LEAVELEAVE语句用来跳出循环语句用来跳出循环 ITERATEITERATE语句用来回到语句用来回到forfor或者或者whilewhile循环的开始重新执行循环的开始重新执行 示例示例 FETCH_LOOP1: LOOPFETC

26、H_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 IF; END IF; INSERT INTO

27、department(deptno, deptname, admdept) INSERT INTO department(deptno, deptname, admdept) 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 GOT

28、O bye; GOTO bye; bye:bye: -29- RETURNRETURN语句语句 RETURNRETURN语句用于向调用返回。语句用于向调用返回。 IF v_DEPT = D11IF v_DEPT = D11 RETURN 1; RETURN 1; -30- 主要内容:主要内容: 1 1、存储过程介绍、存储过程介绍 2 2、存储过程基础结构、存储过程基础结构 3 3、控制语句、控制语句 4 4、游标和结果集、游标和结果集 5 5、异常处理器、异常处理器 6 6、编写和调试存储过程、编写和调试存储过程 -31- 游标的声明游标的声明 下面是游标声明的几个例子:下面是游标声明的几个例

29、子: DECLARE c1 CURSOR FOR select DECLARE c1 CURSOR FOR select * * from staff; from staff; (DECLAREDECLARE关键字,关键字,clcl游标名称,游标名称, CURSORCURSOR是必须有的,;指通过是必须有的,;指通过c1c1的游标来操作的游标来操作staffstaff里所有的数据)最常里所有的数据)最常 用的最普通的。用的最普通的。 2.DECLARE c1 CURSOR WITH HOLD FOR select 2.DECLARE c1 CURSOR WITH HOLD FOR select

30、 * * form form staff;staff; 3.DECLARE c1 CURSOR WITH RETURN TO CALLER FOR 3.DECLARE c1 CURSOR WITH RETURN TO CALLER FOR select select * * form staff; form staff; 1.1.4.DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR 4.DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR select select * * form staff; form staff;

31、-32- 游标的相关操作游标的相关操作 打开游标打开游标 OPEN OPEN 提取游标提取游标 FETCH FETCH INTO INTO 关闭游标关闭游标 CLOSE CLOSE -33- 游标的遍历游标的遍历 DECLARE at_end INT DEFAULT 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

32、0;DECLARE PINT INTEGER DEFAULT 0; DECLARE DECLARE not_found not_found CONDITION 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 =

33、 1; DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1; OPENOPENc1; c1; (进行循环)(进行循环) SET PCOUNT = 0; SET PCOUNT = 0; ins_loop: LOOPins_loop: LOOP FETCH 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 PCO

34、UNT = PCOUNT + 1; SET PCOUNT = PCOUNT + 1; (表示提取了多少条记录)(表示提取了多少条记录) END LOOP;END LOOP; -34- 删除游标对应的数据行删除游标对应的数据行 DECLAREDECLARE cursor1cursor1 CURSORCURSOR FOR FOR SELECTSELECT DEPTNO,DEPTNO, DEPTNAME,DEPTNAME, LOCATIONLOCATION FROMFROM DB2ADMIN.ORG FORDB2ADMIN.ORG FOR UPDATE;UPDATE;(声明一个声明一个cursor1

35、cursor1 的游标,从一个表时提出部门名称,的游标,从一个表时提出部门名称,.,位置),位置) OPENOPEN cursor1;cursor1;(打开游标)(打开游标) FETCHFETCH FROMFROM cursor1cursor1 INTOINTO v_DEPTNO,v_DEPTNO, V_DEPTNAME, v_LOCATION;V_DEPTNAME, v_LOCATION; DELETE FROM DB2ADMIN.ORG WHERE CURRENT OF cursor1;DELETE FROM DB2ADMIN.ORG WHERE CURRENT OF cursor1;(删

36、除删除DB2ADMIN.ORGDB2ADMIN.ORG的记录;的记录; CURRENT OF cursor1CURRENT OF cursor1这是的游标是指向某一个位置;删除游标指向的当前行。)这是的游标是指向某一个位置;删除游标指向的当前行。) CLOSE cursor1;CLOSE cursor1;(关闭游标,也可做一个循环,删除所有的内容关闭游标,也可做一个循环,删除所有的内容) -35- 更新游标对应的数据行更新游标对应的数据行 DECLAREDECLARE cursor1cursor1 CURSORCURSOR FOR FOR SELECTSELECT DEPTNO,DEPTNO,

37、 DEPTNAME,DEPTNAME, LOCATIONLOCATION FROMFROM DB2ADMIN.ORG DB2ADMIN.ORG FORFOR UPDATE;UPDATE; OPENOPEN cursor1;cursor1; FETCHFETCH FROMFROM cursor1cursor1 INTOINTO v_DEPTNO,v_DEPTNO, v_DEPTNAME, v_LOCATION;v_DEPTNAME, v_LOCATION; UPDATE DB2ADMIN.ORG SET DEPTNAME = NEW NAMEWHERE CURRENT OF UPDATE DB2

38、ADMIN.ORG SET DEPTNAME = NEW NAMEWHERE CURRENT OF cursor1;cursor1; CLOSE cursor1;CLOSE cursor1; -36- 使用游标返回多个结果集使用游标返回多个结果集 动态的结果集两个动态的结果集两个 处于打开的状态?处于打开的状态? -37- 主要内容:主要内容: 1 1、存储过程介绍、存储过程介绍 2 2、存储过程基础结构、存储过程基础结构 3 3、控制语句、控制语句 4 4、游标和结果集、游标和结果集 5 5、异常处理器、异常处理器 6 6、编写和调试存储过程、编写和调试存储过程 -38- 异常处理器的声明异

39、常处理器的声明 DECLARE handler-type HANDLER FOR condition handler-action;DECLARE handler-type HANDLER FOR condition handler-action; (语法结构)(异常处理器是需要预先声明的)(语法结构)(异常处理器是需要预先声明的) -39- 异常处理器的类型(异常处理器的类型(handler-typehandler-type) 异常处理器的类型有如下几种:异常处理器的类型有如下几种: CONTINUECONTINUE(继续继续) 在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一

40、条语句。在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。 EXITEXIT(记录完后就退出,不再继续执行记录完后就退出,不再继续执行) 在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。 UNDOUNDO(撤销所做的记录,退出整个程序撤销所做的记录,退出整个程序) 在异常处理器操作执行之前,在异常处理器操作执行之前,DB2DB2会回滚存储过程中执行的会回滚存储过程中执行的SQLSQL操作。在异常处理器操作。在异常处理器 操作完成之后,存储过程会终止,并将控制返回给调用者。操作完成之后,存储过程会

41、终止,并将控制返回给调用者。 -40- 异常处理器和异常处理器和SQLSTATESQLSTATE 异常处理器可以处理基于特定异常处理器可以处理基于特定SQLSTATESQLSTATE值的定制异常,或者处理预定值的定制异常,或者处理预定 义异常的类。预定义的义异常的类。预定义的3 3种异常如下所示:种异常如下所示: NOT FOUNDNOT FOUND 标识导致标识导致SQLCODESQLCODE值为值为100100或者或者SQLSATESQLSATE值为值为0200002000的异常。这个异常通的异常。这个异常通 常在常在SELECTSELECT没有返回行的时候出现。没有返回行的时候出现。 S

42、QLEXCEPTIONSQLEXCEPTION 标识导致标识导致SQLCODESQLCODE值为负的异常。值为负的异常。 SQLWARNINGSQLWARNING 标识导致警告异常或者导致标识导致警告异常或者导致100100以外的以外的SQLCODESQLCODE正值的异常。正值的异常。 注注: :如果产生了如果产生了NOT FOUND NOT FOUND 或者或者SQLWARNINGSQLWARNING异常,并且没有为这个异常定义异常处理器,异常,并且没有为这个异常定义异常处理器, 那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了那么就会忽略这个异常,并且将控制流转向下一个语句。

43、如果产生了SQLEXCEPTIONSQLEXCEPTION异常,异常, 并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用 者。者。 -41- 异常处理器示例异常处理器示例 如下示例声明了两个异常处理器。如下示例声明了两个异常处理器。 EXITEXIT处理器会在出现处理器会在出现SQLEXCEPTION SQLEXCEPTION 或者或者 SQLWARNINGSQLWARNING异常的时候被调用。异常的时候被调用。EXITEXIT处理器会在终止处理器会在终止SQLSQL程序之前,将名为程序

44、之前,将名为 stmtstmt的变量设为的变量设为“ABORTED”,“ABORTED”,并且将控制流返回给调用者。并且将控制流返回给调用者。UNDOUNDO处理器会将处理器会将 控制流返回给调用者之前,回滚存储过程体中已经完成的控制流返回给调用者之前,回滚存储过程体中已经完成的SQLSQL操作。操作。 DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt = ABORTED; SET stmt = ABORTED; DECLARE

45、 UNDO HANDLER FOR NOT FOUND; DECLARE UNDO HANDLER FOR NOT FOUND; -42- 异常处理器定制异常处理器定制 如果预定义异常集不能满足需求,就可以为特定的如果预定义异常集不能满足需求,就可以为特定的SQLSTATESQLSTATE值声明定值声明定 制异常,然后再为这个定制异常声明处理器。语法如下:制异常,然后再为这个定制异常声明处理器。语法如下: DECLARE unique-name CONDITION FOR SQLSATE sqlstate DECLARE unique-name CONDITION FOR SQLSATE sq

46、lstate -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 FROM SYSIBM.SYSDUMMY1; - Use t

47、he poGenStatus variable to tell the procedure - what type of error occurred - Use the poGenStatus variable to tell the procedure - 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

48、 poGenStatus=3; SET poGenStatus=3; ELSE IF (hSqlCode 0) THEN ELSE IF (hSqlCode 0) THEN SET poGenStatus=hSqlCode; SET poGenStatus=hSqlCode; END IF; END IF; END END -44- 更为复杂的异常处理器示例(更为复杂的异常处理器示例(2 of 22 of 2) 上面的异常处理器会在出现上面的异常处理器会在出现SQLEXCEPTION, SQLWARNING, NOT SQLEXCEPTION, SQLWARNING, NOT FOUNDFOUND异常的时候触发。异常处理器会取出当前的异常的时候触发。异常处理器会取出当前的SQLCODE, SQLCODE, SQLSTATESQLSTATE,然后根据它们的值来设置输出参数(,然后根据它们的值来设置输出参数(poGenStatuspoGenStatus)的值。)的值。 -45- 主要内容:主要内容: 1 1、存储过程介绍、存储过程介绍 2 2、存储过程基础结构、存储过程基础结构 3 3、控制语句、控制语句 4 4、游标和结果集、游标和结果集 5 5、异常处理器、异常处理器 6 6、编写和调试存储过程、编写和调试存储过程 -46- 使用使用ODSODS开发存储过程的基本步骤开发存储过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论