2012-03-06 5 views
1

J'ai l'exception à créer. Quelqu'un peut-il m'aider? Comment écrire la boucle imbriquée dans la procédure stockée dans Mysql la bonne manière et ce qui est mon mauvais?Comment créer une boucle imbriquée mysql dans une procédure stockée

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

Je parierais que 99% du temps, si vous imbriquez des curseurs, vous faites quelque chose de mal. [Vous devriez regarder dans les solutions basées sur les ensembles plutôt que sur les procédures.] (Http://stackoverflow.com/questions/1687512/rbar-vs-set-based-programming-for-sql) –

+0

Votre exemple de code est trop long. – usr

Répondre

1

Vous devez utiliser le délimiteur spécifié seulement à la fin de la procédure, mais dans votre code que vous utilisez le $$ delimiter à la fin du bloc intérieur, (et dans d'autres mots que vous utilisez le $ $ delimiter qui signale la fin de la procédure avant qu'elle ne soit réellement terminée)

Questions connexes