存储过程中声明两个游标报错[1338]:游标声明在处理程序之后
解决MySQL存储过程中"Cursor declaration after handler declaration"错误
这个错误的核心原因是MySQL存储过程对声明顺序有强制要求,必须严格遵循以下顺序编写声明:
- 先声明所有变量
- 再声明所有游标
- 最后声明所有处理程序(HANDLER)
你的代码里在第一个DECLARE CONTINUE HANDLER之后又声明了cursor2,违反了这个顺序规则,所以触发了1338错误。
修正后的代码如下:
BEGIN DECLARE is_done INT DEFAULT 0; DECLARE is_done2 INT DEFAULT 0; DECLARE variables VARCHAR(16383) DEFAULT ""; DECLARE variables2 VARCHAR(255); -- 先声明所有游标 DECLARE cursor1 CURSOR FOR SELECT (statement); DECLARE cursor2 CURSOR FOR SELECT (statement); -- 再声明所有处理程序 DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_done = 1; DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_done2 = 1; OPEN cursor1; loop1: LOOP FETCH cursor1 INTO variables; IF is_done = 1 THEN LEAVE loop1; END IF; (statement) END LOOP loop1; CLOSE cursor1; OPEN cursor2; loop2: LOOP FETCH cursor2 INTO variables2; IF is_done2 = 1 THEN LEAVE loop2; END IF; (statement) END LOOP loop2; CLOSE cursor2; END;
补充说明:你给两个游标分别设置独立的NOT FOUND标记变量,这个写法可以避免游标间的逻辑冲突,只要保证声明顺序正确,就能解决当前报错。
内容的提问来源于stack exchange,提问作者Sabri
相关产品推荐
相关产品推荐

