2017-01-27 2 views
0

У меня есть хранимая процедура в базе данных Mysql, как это:оператор Update в хранимой процедуре не работает

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 ;  

Ошибка:

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

, когда я удаляю инструкцию по обновлению, а затем ее рабочий тон –

+0

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

ответ

0

This документация относится к иметь DECLARE заявления на верхней и также перед созданием любых CURSORS и HANDLERS, которые вы используете, но не в начале блока BEGIN... END.

This документация разъясняет вопрос, который был опубликован OP!

Обязательно иметь свои декларации в начале вашего блока BEGIN... END, но не под оператором UPDATE.

Дополнительную ссылку на аналогичную проблему можно найти на вопрос this, даже относящийся к тому же решению.

Надеюсь, это поможет!

+0

благодарит свою работу как шарм. –

+0

Я пробовал много раз, но у меня нет репутации :( –

+0

@AbidHussain, попробуйте сейчас! Принять это! –

Смежные вопросы