2014-10-31 4 views
0

Я довольно новичок в stored procedures в MySQL, но по силе Google и документации я наконец-то закончил (свою) первую процедуру.Ошибка процедуры mysql не работает

CREATE DEFINER=`root`@`localhost` PROCEDURE `modules`() 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE team_id INT; 
    DECLARE phase_id INT; 
    DECLARE module_id INT; 
    DECLARE user_id INT; 
    DECLARE cur1 CURSOR FOR SELECT P.team_id,P.id,M.id,UHT.user_id FROM phase P INNER JOIN module M ON P.Module_id = M.id JOIN user_has_team UHT ON UHT.team_id = P.team_id WHERE M.module_type = 7 or M.module_type = 8 AND P.end <= NOW(); 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur1; 
    read_loop: LOOP 
    FETCH cur1 INTO team_id, phase_id,module_id, user_id; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
     INSERT INTO offline_score VALUES (null,team_id,phase_id,module_id,1,NOW(),1); 
    END LOOP; 
END 

Теперь я хотел проверить мое творение и сделал следующее

CALL modules 

Однако после проверки моего offline_score таблицы я мог видеть, что ничего не вставляли.

Может ли кто-нибудь увидеть, есть ли проблемы с моим кодом или узнать, как я могу отлаживать, я могу найти ошибку?

После вызова я получаю следующий результат:

1 14:36:24 CALL modules 0 row(s) affected, 1 warning(s): 1329 No data - zero rows fetched, selected, or processed 
+0

Вы получаете какие-либо ошибки? Если бы вы не попытались выполнить запрос вручную, который у вас есть внутри процедуры, чтобы увидеть, возвращает ли он некоторые данные. Кроме того, 'end' - зарезервированное ключевое слово, которое вы используете в запросе, обязательно используйте для него обратную ссылку. –

+0

Я получаю следующий вывод: 12:46:59 \t CALL modules \t 30 строк (ов) возвращено –

ответ

1

Я не знаю, что выглядит ваши данные, как, но этот запрос может быть проблема:

SELECT P.team_id,P.id,M.id,UHT.user_id FROM phase P 
    INNER JOIN module M ON P.Module_id = M.id 
    JOIN user_has_team UHT ON UHT.team_id = P.team_id 
    WHERE M.module_type = 7 or M.module_type = 8 AND P.end <= NOW(); 

Попробуйте изменить where к

WHERE M.module_type = 7 or (M.module_type = 8 AND P.end <= NOW()); 

или

WHERE (M.module_type = 7 or M.module_type = 8) AND P.end <= NOW(); 

в зависимости от ваших потребностей

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