MYSQL游标循环,运行一个额外的回合,为什么?

Tha*_*anu 16 mysql loops stored-procedures cursor

我正在循环MYSQL存储过程中的游标结果集.我面临的问题是循环总是在最后一次记录中运行两次.这是我的代码,

BEGIN
DECLARE not_found_creadit INT DEFAULT 0;

DECLARE cur_credit CURSOR FOR 
SELECT customer_id, amount, status, user_type, employee, note FROM credit WHERE status = 'approved' AND customer_id = int_cust_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found_creadit = 1;
OPEN cur_credit;
  SET not_found_creadit = 0;
  credit_loop : LOOP 
      IF not_found_creadit THEN
        CLOSE cur_credit;
        LEAVE credit_loop;
      END IF;
      FETCH cur_credit INTO vc_customer, dec_amount, vc_status, vc_user_type, vc_emp, vc_note;
      SELECT vc_customer, dec_amount, vc_status, vc_user_type, vc_emp, vc_note;
      ......
      ......
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

意味着如果我有3条记录,循环运行4次,如果它是10条记录循环运行11次,等等.任何想法发生在这里?

Boh*_*ian 22

设置的处理程序not_found_creadit = 1FETCH返回没有行时被触发,但是你执行之前检查它的值FETCH,所以循环的主体将在FETCH失败时执行一个额外的时间,然后循环循环在下一个开始时退出迭代.

重新安排你的代码,立即检查变量的值之后FETCH:

credit_loop : LOOP 
    FETCH cur_credit INTO vc_customer, dec_amount, vc_status, vc_user_type, vc_emp, vc_note;
    IF not_found_creadit THEN
        CLOSE cur_credit;
        LEAVE credit_loop;
    END IF;
    SELECT vc_customer, dec_amount, vc_status, vc_user_type, vc_emp, vc_note;
    ......
    ......
END LOOP;
Run Code Online (Sandbox Code Playgroud)


另外,请考虑将变量的拼写更正为 not_found_credit