经常在定义cursor的时候都会定义cursor未找到(NOT FOUND或SQLSTATE '02000')的条件来标识游标结束。
完整的存储过程如下:
CREATE PROCEDURE PR_IMA_XHW_GENERATEOUTPUTTAX()
BEGIN
DECLARE C_C1 VARCHAR(32);
DECLARE C_C2 VARCHAR(32);
DECLARE DONE BOOLEAN DEFAULT 0; #定义结束标识
#定义游标
DECLARE CURSORDATA CURSOR FOR SELECT C1,C2 FROM T1;
#定义游标的结束--当遍历完成时,将DONE设置为1
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1;
OPEN CURSORDATA; #打开游标
FETCH CURSORDATA INTO C_C1,C_C2;
REPEAT
SELECT COLUMNS FROM T2; #注意点!!!
#还有一些逻辑或者查询不一一列出
INSERT INTO T3(
T3_C1,
T3_C2
)
VALUES(
C_C1,
C_C2
);
FETCH CURSORDATA INTO C_C1,C_C2;
UNTIL DONE
END REPEAT;
CLOSE CURSORDATA; #关闭游标
END;
上面的存储过程看似没有问题,但是要注意 SQLSTATE '02000'这个条件!!!
如果在上面的注意点处,没有查到数据,这时候就会触发SQLSTATE '02000',造成DONE设置为1,这样就造成了存储过程在使用游标的时候遍历的一次或者不完整遍历的问题!!!
相信很多新手在写的时候都会遇到这个坑。所以需要注意SQLSTATE '02000'或者NOT FOUND不是作用在游标上的,而是作用与整个存储过程,千万注意!!!