删除游标对应的数据行
DECLARE cursor1 CURSOR FOR SELECT DEPTNO, DEPTNAME, LOCATION
FROM DB2ADMIN.ORG FOR UPDATE;(声明一个cursor1的游标,从一个表时提出部门名称,...,位置)
OPEN cursor1;(打开游标)
FETCH FROM cursor1 INTO v_DEPTNO, V_DEPTNAME, v_LOCATION;
DELETE FROM DB2ADMIN.ORG WHERE CURRENT OF cursor1;(删除DB2ADMIN.ORG的记录; CURRENT OF cursor1这是的游标是指向某一个位置;删除游标指向的当前行。)
CLOSE cursor1;(关闭游标,也可做一个循环,删除所有的内容)
更新游标对应的数据行
DECLARE cursor1 CURSOR FOR SELECT DEPTNO, DEPTNAME, LOCATION
FROM DB2ADMIN.ORG FOR UPDATE;
OPEN cursor1;
FETCH FROM cursor1 INTO v_DEPTNO, v_DEPTNAME, v_LOCATION;
UPDATE DB2ADMIN.ORG SET DEPTNAME = ‘NEW NAME’WHERE CURRENT OF cursor1;
CLOSE cursor1;
九 异常处理器
异常处理器的声明
DECLARE handler-type HANDLER FOR condition handler-action;
(语法结构)(异常处理器是需要预先声明的)
异常处理器的类型(handler-type)
异常处理器的类型有如下几种:
CONTINUE(继续)
在异常处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。
EXIT(记录完后就退出,不再继续执行)
在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
UNDO(撤销所做的记录,退出整个程序)
在异常处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在异常处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
异常处理器和SQLSTATE
异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:
NOT FOUND
标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。
SQLEXCEPTION
标识导致SQLCODE值为负的异常。
SQLWARNING
标识导致警告异常或者导致+100以外的SQLCODE正值的异常。
注:如果产生了NOT FOUND 或者SQLWARNING异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者
异常处理器示例
如下示例声明了两个异常处理器。 EXIT处理器会在出现SQLEXCEPTION 或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为“ABORTED”,并且将控制流返回给调用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
SET stmt = 'ABORTED';
DECLARE UNDO HANDLER FOR NOT FOUND;
异常处理器定制
如果预定义异常集不能满足需求,就可以为特定的SQLSTATE值声明定制异常,然后再为这个定制异常声明处理器。语法如下:
DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
更为复杂的异常处理器示例(1 of 2)
-- Generic Handler
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
BEGIN NOT ATOMIC
-- Capture SQLCODE & SQLSTATE
SELECT SQLCODE, SQLSTATE
INTO hSqlcode, hSqlstate
FROM SYSIBM.SYSDUMMY1;
-- Use the poGenStatus variable to tell the procedure -- what type of error occurred
CASE hSqlstate
WHEN '02000' THEN
SET poGenStatus=5000;
WHEN '42724' THEN
SET poGenStatus=3;
ELSE IF (hSqlCode < 0) THEN
SET poGenStatus=hSqlCode;
END IF;
END
上面的异常处理器会在出现SQLEXCEPTION, SQLWARNING, NOT FOUND异常的时候触发。异常处理器会取出当前的SQLCODE, SQLSTATE,然后根据它们的值来设置输出参数(poGenStatus)的值。
十 编写和调试存储过程
创建存储过程
将存储过程部署到本地或远程DB2数据库
修改并重新部署存储过程
对存储过程进行测试和Debug
使用Command Editor创建存储过程(1 of 3)