2012-03-06 49 views
1

我得到了要創建的異常。有誰能夠幫助我?如何在Mysql中以正確的方式編寫存儲過程中的嵌套循環以及我的錯誤是什麼?如何在存儲過程中創建mysql嵌套循環

DELIMITER $$ 

`INVESTMENT_MATCH_POINT_CREATOR`(_percentage INT, _vat_tex INT) 
BEGIN 
    DECLARE _user_id INT; 
    DECLARE _package_id INT; 


    DECLARE _left_investment INT; 
    DECLARE _right_investment INT; 

    DECLARE _left_point INT; 
    DECLARE _right_point INT; 

    DECLARE _left_carry_point INT; 
    DECLARE _right_carry_point INT; 

    DECLARE _get_point INT; 

    DECLARE done BOOLEAN DEFAULT FALSE; 
    DECLARE _user_investment_table CURSOR FOR SELECT user_id,package_id,left_invesetment,right_investment DATA FROM user_investment_match; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN _user_investment_table; 

    read_loop:LOOP 

    FETCH _user_investment_table INTO _user_id,_package_id,_left_investment,_right_investment; 

    IF done THEN 
    LEAVE read_loop; 
    END IF; 

     BEGIN 
       DECLARE _match_point INT; 
       DECLARE done2 BOOLEAN DEFAULT FALSE; 

       DECLARE _package_match_point_table CURSOR FOR SELECT match_point DATA FROM package_match_points WHERE package_id=_package_id ORDER BY match_point DESC; 
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = TRUE; 

       OPEN _package_match_point_table; 
       read_loop2:LOOP 

       FETCH _package_match_point_table INTO _match_point; 

        IF done2 THEN 
        LEAVE read_loop2; 
        END IF; 

        /*if(_match_point=<_left_investment) and (_match_point=<_right_investment) then 
         set _left_point=abs(_left_investment-_match_point); 
         set _right_point=abs(_right_investment-_match_point); 
         set _get_point=((_match_point*_percentage)/100); 
        end if;*/ 

       END LOOP; 
       CLOSE _package_match_point_table; 
      END$$ 




    END LOOP; 
    CLOSE _user_investment_table; 

END$$ 

DELIMITER ; 
+0

99%的時間我會下注,如果你在嵌套遊標,你做錯了什麼。 [你應該看看基於集合的解決方案,而不是程序性的。](http://stackoverflow.com/questions/1687512/rbar-vs-set-based-programming-for-sql) – 2012-03-06 19:49:27

+0

您的示例代碼太長。 – usr 2012-03-06 20:10:46

回答

1

您應該只在手術結束時使用指定的分隔符,但在你的代碼中使用的$$分隔符在內部塊結束時,(在換句話說,你正在使用$ $ delimiter在實際結束之前表示程序結束)