2017-01-27 1 views
0

j'ai une procédure stockée dans la base de données Mysql comme ceci:déclaration de mise à jour dans la procédure stockée ne fonctionne pas

DELIMITER $$ 

USE `vboard_75`$$ 

DROP PROCEDURE IF EXISTS `sp_LongWaitCall`$$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_LongWaitCall`() 

BEGIN 


    UPDATE cdr SET cdr.CallStatus='DISCONNECTED',cdr.EndTime=NOW() WHERE cdr.CallStatus='RINGINGIN' 
    AND MINUTE(DATEDIFF(cdr.StartTime,NOW())) >=7; 

    DECLARE _StatVal FLOAT; 
    DECLARE _DevID INT; 
    DECLARE Record_Fetch INT DEFAULT 0; 
    DECLARE crsr_Board CURSOR FOR 
    SELECT IFNULL(MAX(SECOND(DATEDIFF(CDR.StartTime, IFNULL(CDR.EndTime, NOW())))), 0) AS LRT,vw_Boards_Ext.boardid 
    FROM vw_Boards_Ext RIGHT OUTER JOIN 
       boards ON vw_Boards_Ext.boardid = boards.boardid LEFT OUTER JOIN 
       CDR ON vw_Boards_Ext.Ext = CDR.DDI AND 
       STR_TO_DATE(CONCAT(boards.ResetDate,' ',boards.ResetTime),'%m/%d/%Y %H:%i') < CDR.timestamp 
    AND CDR.CallStatus='RINGINGIN' 
    GROUP BY vw_Boards_Ext.boardid; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET Record_Fetch = 1; 
    OPEN crsr_Board; 
    FETCH crsr_Board INTO _StatVal, _DevID; 
    WHILE Record_Fetch = 0 DO 

     UPDATE stat_values AS sv SET sv.StatValue = _StatVal,sv.timestamp= NOW() 
     WHERE sv.itemId = _DevID AND sv.itemType = 'boards' AND sv.StatId = 3; 
     FETCH crsr_Board INTO _StatVal, _DevID; 

    END WHILE; 
    CLOSE crsr_Board; 
    DEALLOCATE PREPARE crsr_Board; 
END$$ 

DELIMITER ;  

Erreur:

Query: CREATE DEFINER= root @localhost PROCEDURE sp_LongWaitCall() BEGIN update cdr set cdr.CallStatus='DISCONNECTED',cdr.EndTime=n...

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DECLARE _StatVal FLOAT; DECLARE _DevID INT; DECLARE Record_Fetch INT DEFAULT 0' at line 8

Execution Time : 0 sec
Transfer Time : 0 sec
Total Time : 0.001 sec

+0

lorsque je supprime instruction de mise à jour, puis son fonctionnement bien –

+0

https://dev.mysql.com/doc/refman/5.7/en/declare.html –

Répondre

0

This documentation fait référence à avoir les DECLARE déclarations en haut et également avant la création de CURSORS et HANDLERS, que vous suivez mais pas au début du bloc BEGIN... END.

This La documentation clarifie la question posée par OP!

Il est obligatoire d'avoir vos déclarations au début de votre bloc BEGIN... END, mais pas sous une instruction UPDATE.

Une référence supplémentaire à un problème similaire peut être trouvée sur this question, même qui se réfère à la même solution.

Espérons que cela aide!

+0

remercie son travail comme un charme. –

+0

j'ai essayé beaucoup de temps mais je n'ai aucune réputation :( –

+0

@AbidHussain, essayez peut-être maintenant! Pour l'accepter! –