может кто-нибудь помочь мне с синтаксисом триггеров mysql

SQL-запрос: Документация

DELIMITER //
CREATE TRIGGER `test` AFTER INSERT ON `test_series`
  FOR EACH ROW
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE ids INT;
set ids=1;
DECLARE cur CURSOR FOR SELECT NEW.no_of_exam
  FROM test_series WHERE serise_id = NEW.series_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
ins_loop:
LOOP FETCH cur INTO ids;
IF done THEN LEAVE ins_loop;
END IF;
INSERT INTO test_details (series_id,test_no) VALUES(new.series_id,);
ids=ids+1 END LOOP;
CLOSE cur;
END;
//

MySQL сказал: Документация

#1064 - У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «DECLARE cur CURSOR FOR SELECT NEW.no_of_exam FROM test_series WHERE serise_id =» в строке 7


person Amit Chauhan    schedule 19.05.2015    source источник
comment
Также следуйте этим рекомендациям: Как спросить и stackoverflow.com/help/mcve   -  person Soma    schedule 19.05.2015


Ответы (1)


Вы не можете DECLARE где угодно и когда угодно. Все операторы DECLARE должны находиться поверх блока BEGIN.

В вашем коде между некоторыми операторами DECLARE есть оператор set ids=1;. И это нарушает DECLARE требования.

Пожалуйста, внесите следующие изменения в свой код.

BEGIN
    -- all declares should be just below a 'begin'
    DECLARE done INT DEFAULT FALSE;
    DECLARE ids INT;
    DECLARE cur CURSOR 
        FOR SELECT NEW.no_of_exam FROM test_series 
             WHERE serise_id = NEW.series_id;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    -- now start your biz logic after all 'declare' statements.      
    SET ids=1;

    OPEN cur;
        ins_loop: LOOP
            FETCH cur INTO ids;
            IF done THEN
                LEAVE ins_loop;
            END IF;
            INSERT INTO test_details (series_id,test_no) VALUES(new.series_id,);

        SET ids=ids+1;
        END LOOP;
    CLOSE cur;
END;

Кстати: вы читаете курсор в переменную, но не используете! Почему? Я полагаю, вы хотите использовать его как test_no в операторе вставки. Если да, то оператор insert нуждается в следующих изменениях:

INSERT INTO test_details (series_id,test_no) VALUES(new.series_id, ids);

Ссылка на документ:

Синтаксис DECLARE< /а>

DECLARE допускается только внутри составного оператора BEGIN ... END и должен находиться в его начале перед любыми другими операторами.

Декларации должны следовать определенному порядку. Объявления курсора должны стоять перед объявлениями обработчика. Объявления переменных и условий должны стоять перед объявлениями курсора или обработчика.

person Ravinder Reddy    schedule 19.05.2015
comment
так как мне нужно зациклить оператор вставки столько раз, сколько значение было получено в cur. - person Amit Chauhan; 20.05.2015
comment
хорошо... вы протестировали предложенные изменения?? вы получили желаемый результат ?? - person Ravinder Reddy; 20.05.2015
comment
да, я получил желаемый результат, внеся некоторые изменения, пожалуйста, посмотрите мой предыдущий ответ, который я только что обновил, и предложите, если в этом что-то не так. - person Amit Chauhan; 20.05.2015