加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在DB2中什么情况出现NOT FOUND异常

(2013-07-26 22:02:34)
标签:

db2

notfound

情况

事件

过程

分类: 数据库类

场景:有个存储过程DELETE_CTW()

CREATE OR REPLACE  PROCEDURE "AIS"."DELETE_CTW" (  )
  SPECIFIC C_INMB
  LANGUAGE SQL
  NOT DETERMINISTIC
  EXTERNAL ACTION
  MODIFIES SQL DATA
  CALLED ON NULL INPUT
  INHERIT SPECIAL REGISTERS
BEGIN
DECLARE i INT DEFAULT 0;
declare n int ;
declare row_id  varchar(40) for bit data;
declare key varchar(40);
DECLARE notFound INT DEFAULT 0;
DECLARE cur CURSOR WITH HOLD FOR SELECT rowid,acct_no FROM  C_INMB;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET notFound = 1;

OPEN cur;
FETCH cur INTO row_id,key;WHILE notFound=0 DO
SET i=i+1;

set n=(select count(*) from tmp.a_inmb where acct_no=key);

if n=1 then
delete from C_INMB where rowid=row_id;
end if;
SET notFound=0;
FETCH cur INTO row_id,key;
END WHILE;
CLOSE cur;
END

在这个存储过程中我们定义了一个HANDLER FOR是出现NOT FOUND异常就重新设置变量notFound=1,这时当初认为存储过程后面又设置SET notFound=0是多余的(declare默认这个变量为0),这时查询存储过程相关的资料发现有个sample:

declare not_found condition for sqlstate '02000';

declare continue handler for not_found set at_end=1;

从上得出它定义一个SQLSTATE '02000'的错误信号为not_found事件,并出现此事件设置变量at_end=1,这时得出SQLSTATE‘02000’的错误就是Not found异常,通过查找DB2的消息参考书发现sqlstate 02000的错误SQLCODE是0100,然后使用命令查找此错误SQLCODE信息,错误如下:

   D:\Program Files\IBM\SQLLIB\BIN>db2 ? sql0100


SQL0100W  找不到进行 FETCH、UPDATE 或 DELETE 操作的行;或者查询
      的结果是一个空表。

说明:

下列其中一个条件为真:
找不到满足在 UPDATE 或 DELETE 语句中所指定搜索条件的行。
SELECT 语句的结果是一个空白表。
当游标定位在结果表的最后一行之后时,执行一个 FETCH 语句。
用在 INSERT 语句中的 SELECT 的结果为空。

通过错误信息得出:

  1.NOT FOUND是SQL0100W的默认事件可以不需定义

  2.在DELETE_CTW()过程中在FETCH游标前定义SET notFound=0并不是多余的,而是防止在FETCH之前出现其他的操作有NOT FOUND异常导致循环退出,而不是由于FETCH游标结束而退出循环的.

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有