




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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
4、CREATE OR REPLACE PROCEDURE ( IN | OUT | INOUT ( IN | OUT | INOUT 参数名参数名 数据类型数据类型 默认值默认值 ) )LANGUAGE SQLLANGUAGE SQLBEGINBEGIN 业务逻辑代码业务逻辑代码END;END;-8-参数类型参数类型ININ(输入参数)(输入参数) 只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说,只是将实参传递给存储过程,但在存储过程中不能对其进行修改。换句话说,对于存储过程而言它是只读的。对于存储过程而言它是只读的。OUTOUT(输出参数)(输出参数) 在存储过程结束时向调
5、用者返回。一般在过程中都会被赋值。在存储过程结束时向调用者返回。一般在过程中都会被赋值。INOUTINOUT(输入输出参数)(输入输出参数) 上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另外它上述两种参数类型的结合体。它可以帮助调用者将实参传递给进程,另外它也能够作为输出参数被修改和赋值。也能够作为输出参数被修改和赋值。-9-复合语句复合语句 复合语句是指包含在复合语句是指包含在BEGINBEGIN和和ENDEND间的语句。它一间的语句。它一般包括如下语句类型:般包括如下语句类型:声明语句声明语句赋值语句赋值语句控制语句控制语句条件处理语句条件处理语句-10-复合语句示例复合语
6、句示例说明:说明:1. 1. 复合语句可以嵌套使用。复合语句可以嵌套使用。2. BEGIN2. BEGIN语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。语句可以和标签组合使用,这样可以更清晰的标识语句块的范围。-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、标声明游标声明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 将会返回将会返回SQLERRORSQLERROR。-13-存储过程例子存储过程例子-14-嵌套存储过程例子嵌套存储过程例子-15-模块模块(Module)(Module)模块是如下几种对象的集合:模块是如下几种对象的集合: SPSP,UDFUDF,global variables and cursorsglobal variables and cursors,typestypes,conditionsconditions模块的主要优势:模块的主要优势: 结构良好,便于组织结构良好,便于组织 范围限定范围限定 CALL CALL mySchema.
10、myModule.myProcmySchema.myModule.myProc() () 信息隐藏信息隐藏 每个对象都可以是每个对象都可以是 public public 或或 privateprivate 权限控制权限控制 可以模块为单位,而不是以模块中的对象为单位来控制权限可以模块为单位,而不是以模块中的对象为单位来控制权限-16-模块模块 - - 规格说明规格说明(Module Specification)(Module Specification)模块可以发布模块可以发布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-模块模块 - - 实现实现(Module Implementation)(Module Implementation)下面的代码是模块的实现部分:下面的代码是模块的实现部分: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-模块模块 - - 其他语句其他语句删除整个模块删除整个模块 DROP MODULE DROP MODULE myModmyMod; ;保留规格说明内容,删除实现保留规格说明内容,删除实现 ALTER MODULE ALTER MODULE myModmyMod DROP BODY; DROP BODY;删除模块中的存储过程删除模块中的存储过程(SP)(SP) ALTER MODULE ALTER MODULE myModmyMod DROP PRO
16、CEDURE DROP PROCEDURE myProcmyProc; ;将模块的执行权限赋给将模块的执行权限赋给joejoe GRANT EXECUTE ON MODULE GRANT EXECUTE ON MODULE myModmyMod TO TO joejoe; ;-19-主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程-20-IF IF语句语句格式:格式:IF IF 条件1 THENTHEN stat
17、ement1;statement1;ELSEIFELSEIF 条件2 THENTHEN statement2;statement2;ELSEELSE statement3;statement3; END END IF;IF;注注: :条件成立时为条件成立时为TRUE (TRUE (真真), ),不成立时为不成立时为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;(如果满足于(如果满足于.时,薪水调整时,薪水调整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)简单简单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; ;标签标签关键字关键字-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、制循环语句来控制循环 LEAVELEAVE语句用来跳出循环语句用来跳出循环 ITERATEITERATE语句用来回到语句用来回到forfor或者或者whilewhile循环的开始重新执行循环的开始重新执行示例示例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语句用于直接跳转到指定标签处。例如:语句用于直接跳转到指定标签处。例如:IF IF v_DEPTv_DEPT = D11 = D11 GOTO bye; GOTO bye;bye:bye:-29-RETURNRETURN语句语句RETURNRETURN语句用于向调用返回。语句用于向调用返回。IF IF v_DEPTv_DEPT = D11 = D11 RETURN 1; RETURN 1;-30-主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3
28、3、控制语句、控制语句4 4、游标和结果集、游标和结果集5 5、异常处理器、异常处理器6 6、编写和调试存储过程、编写和调试存储过程-31-游标的声明游标的声明下面是游标声明的几个例子:下面是游标声明的几个例子:1.1.DECLARE c1 CURSOR FOR select DECLARE c1 CURSOR FOR select * * from from staff;staff;2.2.(DECLAREDECLARE关键字,关键字,clcl游标名称,游标名称, CURSORCURSOR是必须有的,;指通过是必须有的,;指通过c1c1的游标来操作的游标来操作staffstaff里所有的数据
29、)最常里所有的数据)最常用的最普通的。用的最普通的。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-游标的相关操作游标的相关操作打开游标打开游标OPEN OPEN 提取游标提取游标FETCH FETCH INTO INTO 关闭游标关闭游标CLOSE CLOSE -33-游标的遍历游标的遍历DECLARE DECLARE at_endat_end INT DEFAULT 0; INT DEFAULT 0; (声明了(声明了at_endat_end的变量,默认值是的变量,
31、默认值是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; (声明了一个游标,把声明了一个游标,把IIDIID的指标拿出来)的指标拿出来)DECLARE CONTINUE HANDLER FOR DECLARE CONTINUE HANDLER FOR not_foundnot_found SET SET at_endat_end = 1; = 1; OPENOPENc1; c1; (进行循环)(进行循环)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跳出循环)跳出循环) END IF; END IF; SET PCOUNT = SET PCOUNT = PCOUNTPCOUNT + + 1; 1; (表示提取了多少条记录)(表示提取了多少条记录)END LOOP;END LOOP;-34-删除游标对应的数据行删除游标对应的数据行DECLAREDECLARE cursor1cursor1 CURSORCURSOR FOR FOR SELECTSELECT DEPTNO,DEPTNO, DEPTNAME,DEPTNAME, L
34、OCATIONLOCATION FROMFROM DB2ADMIN.ORG FORDB2ADMIN.ORG FOR UPDATE;UPDATE;(声明一个声明一个cursor1cursor1的游标,从一个表时提出部门名称,的游标,从一个表时提出部门名称,.,位置),位置)OPENOPEN cursor1;cursor1;(打开游标)(打开游标)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这是的游标是指向某一个位置;删除游标指向的当前行。)这是的游标是指向某一个位置;删除游标指向的当前行。)CLOSE CLOSE cursor1;cursor1;(关闭游标,也可做一个循环,删除所有的内容关闭游标,也可做一个循环,删除所有的内容)-35-更新游标对应的数据行更新游标对应的
36、数据行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-使用游标返回多个结果集使用游标返回多个结果集动态的结果集两个动态的结果集两个处于打开的状态?处于打开的状态?-37-主要内容:主要内容:1 1、存储过程介绍、存储过程介绍2 2、存储过程基础结构、存储过程基础结构3 3、控制语句、控制语句4 4
38、、游标和结果集、游标和结果集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)异常处理器的类型有如下几种:异常处理器的类型
39、有如下几种:CONTINUECONTINUE(继续继续) 在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。 EXITEXIT(记录完后就退出,不再继续执行记录完后就退出,不再继续执行) 在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。 UNDOUNDO(撤销所做的记录,退出整个程序撤销所做的记录,退出整个程序) 在异常处理器操作执行之前,在异常处理器操作执行之前,DB2DB2会回滚存储过程中执行的会回滚存储过程中执行的SQL
40、SQL操作。在异常处理器操作。在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。操作完成之后,存储过程会终止,并将控制返回给调用者。 -40-异常处理器和异常处理器和SQLSTATESQLSTATE 异常处理器可以处理基于特定异常处理器可以处理基于特定SQLSTATESQLSTATE值的定制异常,或者处理预定值的定制异常,或者处理预定义异常的类。预定义的义异常的类。预定义的3 3种异常如下所示:种异常如下所示: NOT FOUNDNOT FOUND 标识导致标识导致SQLCODESQLCODE值为值为100100或者或者SQLSATESQLSATE值为值为0200002000的异
41、常。这个异常通的异常。这个异常通常在常在SELECTSELECT没有返回行的时候出现。没有返回行的时候出现。 SQLEXCEPTIONSQLEXCEPTION 标识导致标识导致SQLCODESQLCODE值为负的异常。值为负的异常。 SQLWARNINGSQLWARNING 标识导致警告异常或者导致标识导致警告异常或者导致100100以外的以外的SQLCODESQLCODE正值的异常。正值的异常。 注注: :如果产生了如果产生了NOT FOUND NOT FOUND 或者或者SQLWARNINGSQLWARNING异常,并且没有为这个异常定义异常处理器,异常,并且没有为这个异常定义异常处理器,
42、那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTIONSQLEXCEPTION异常,异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。者。 -41-异常处理器示例异常处理器示例 如下示例声明了两个异常处理器。如下示例声明了两个异常处理器。 EXITEXIT处理器会在出现处理器会在出现SQLEXCEPTION SQLEXCEPTION 或者或者SQLWARNINGSQLWARNING异常的时候
43、被调用。异常的时候被调用。EXITEXIT处理器会在终止处理器会在终止SQLSQL程序之前,将名为程序之前,将名为stmtstmt的变量设为的变量设为“ABORTED”,“ABORTED”,并且将控制流返回给调用者。并且将控制流返回给调用者。UNDOUNDO处理器会将处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的控制流返回给调用者之前,回滚存储过程体中已经完成的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-异常处理器定制异常处理器定制 如果预定义异常集不能满足需求,就可以为特定的如果预定义异常集不能满足需求,就可以为特定的SQLSTATESQLSTATE值声明定值声明定制异常,然后再为这个定制异常声明处理器。语法如下:制异常,然后再为这个定制异常声明处理器。语法如下: DECLARE unique-name CONDITION FOR SQLSATE DECLAR
45、E unique-name CONDITION FOR SQLSATE sqlstatesqlstate -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 - 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-更为复杂的异常处理器示例(更为复杂的异常处理器示例(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、游标和结果集、游标和结果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新版人教版一年级道德与法治下册教学计划
- 幼儿园游乐设施安全教育心得体会
- 河道深基坑防洪施工方案与技术措施
- 2025六年级数学下册人教版教学改革计划
- 二年级校本阅读课程设计计划
- 中国平安保险综合管理实习报告范文
- 部编八年级上册语文课题研究计划
- 2025部编版五年级语文下册复习计划方案
- 2024-2025学年河南省部分名校高二下学期3月联考英语试卷
- 2024-2025学年山东省菏泽市东明第一中学高一下学期第一次月考英语试题
- 2025至2030中国纤维素纳米纤维(CNF)行业项目调研及市场前景预测评估报告
- (高清版)T∕CES 243-2023 《构网型储能系统并网技术规范》
- 山东淄博小升初数学真题试卷
- 网约车公司风险管理制度
- 企业丧事慰问管理办法
- 医院智慧管理分级评估标准体系(试行)-全文及附表
- 中国画基础知识课件
- 厨房燃气安全管理办法
- 即时零售配送骑手管理痛点破解报告 2025
- 神经重症患者镇痛镇静治疗中国专家共识解读
- 教科版2025小学二年级科学教学发展规划计划
评论
0/150
提交评论