2012-09-06 138 views
13

我正在循环访问MYSQL存储过程中的游标结果集。我面临着一个问题,即循环总是运行两次最后一个记录。这里是我的代码,如果我有3条记录,循环运行的4倍,如果是10条循环运行11次,等等。任何想法发生了什么这里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; 

手段?

+1

这可能会帮助 - > [光标放在最后一行两次迭代( http://forums.mysql.com/read.php?102,155063,155063) – Kermit

+0

是的,这真的有效。 Thanx – Thanu

+0

链接现在缺失 – ejectamenta

回答

16

的处理器,这台not_found_creadit = 1,是执行FETCH之前当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; 


另外,还要考虑纠正你的变量的拼写not_found_credit

-1

必须正确的类型,因为我写默认(我不知道你有什么表信用)。结束。如果U创建表不是Temptable使用

TRUNCATE TempTable; 

请重写例如

CREATE CREATE TEMPORARY TABLE TempTable (`Id` int(11) NOT NULL auto_increment, 
    `customer_id` int(11) NOT NULL, 
    `amount` int(11) NOT NULL, 
    `status` varchar(1000) NOT NULL, 
    `user_type` int(11) NOT NULL default '0', 
    `employee` varchar(1000) NOT NULL, 
    PRIMARY KEY (`customer_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;"); 

ofcourse类型是坏:)

DELIMITER $$ 
    DROP PROCEDURE IF EXISTS CursorX $$ 
    CREATE PROCEDURE `CursorX`() 
    BEGIN  
      DECLARE xCustomerId int(11); 
      DECLARE xStatus int(11); 
      DECLARE xUserType varchar(255); 
      DECLARE xEmployee varchar(255); 
      DECLARE xNote varchar(255); 
      DECLARE i int(11); 
      DECLARE recordNotFound INTEGER 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 recordNotFound = 1; 

      DROP TEMPORARY TABLE IF EXISTS TempTable; 
      CREATE TEMPORARY TABLE TempTable AS(SELECT * FROM credit); 

      OPEN cur_credit; 
      set not_found_creadit = 0; 
      credit_loop: LOOP 
      SET i = i +1; 
       FETCH cur_credit INTO xCustomerId,xStatus,xUserType,xEmployee,xNote; 
       IF not_found_creadit THEN 
        LEAVE credit_loop; 
       END IF; 
      END LOOP credit_loop; 
      CLOSE cur_credit; 
    select * FROM TempTable; 

    END $$ 
相关问题