попробуйте создать событие с курсором в MySQL

0

Я хотел бы создать событие с помощью курсора. Но получение ошибки ниже

Ошибка:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

Код:

create event api_5 ON SCHEDULE EVERY 360 SECOND DO
BEGIN
DECLARE lc_current_time DATETIME;
DECLARE unuse_count INT;
DECLARE auto_assign TINYINT;
DECLARE total_sum INT;
DECLARE check_count INT;
SET lc_current_time = CONVERT_TZ(NOW(), @@session.time_zone, '+0:00');

DECLARE select_cursor CURSOR FOR SELECT unuse_count,auto_assign,total_sum,check_count from new_api;

OPEN select_cursor;
LOOP
     FETCH select_cursor INTO unuse_count,auto_assign,total_sum,check_count
     if(unuse_count <= check_count){
        insert into api_report(date,new_api_id,api_name,type,status,email,customer_id,unuse_count,check_count) values (lc_current_time,5,'abc',4,1,'[email protected]',check_count,unuse_count);
        }
     END;
END LOOP;
CLOSE select_cursor;
END;

Любой хотел бы предложить, почему он показывает на третьей строке. Существуют ограничения, которые мы не можем изменять несколько раз. Я пытаюсь в первый раз. Поэтому, пожалуйста, игнорируйте любые ошибки.

Примечание. Вставить запрос и выбрать запрос, оба работают нормально.

Вторая ошибка:

ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE select_cursor CURSOR FOR SELECT unuse_count,auto_assign,total_sum,check_' at line 10
  • 0
    Вы определили delimiter ?
  • 0
    Я подумал, что если мы напрямую выполним запрос из командной строки. Тогда нет необходимости в разделителе. Не так ли?
Показать ещё 1 комментарий
Теги:

2 ответа

0

Вот ответ:

Исправления:

  1. Разделитель не добавляется. который дает первую ошибку, поэтому добавили разделитель в начале и в конце.

  2. Без полного объявления все объявления переменной начали использовать его. В ответ я поставлю SET lc_current_time = CONVERT_TZ(NOW(), @@session.time_zone, '+0:00'); после курсора.

  3. If condition не добавлено в соответствии с синтаксисом mysql

Рабочее решение:

delimiter $$
create event api_6 ON SCHEDULE EVERY 360 SECOND DO
BEGIN
DECLARE lc_current_time DATETIME;
DECLARE unuse_count INT;
DECLARE auto_assign TINYINT;
DECLARE total_sum INT;
DECLARE check_count INT;
DECLARE select_cursor CURSOR FOR SELECT unuse_count,auto_assign,total_sum,check_count from new_api;
SET lc_current_time = CONVERT_TZ(NOW(), @@session.time_zone, '+0:00');
OPEN select_cursor;
LOOP
     FETCH select_cursor INTO unuse_count,auto_assign,total_sum,check_count;
        IF unuse_count <= check_count THEN
          insert into api_report(date,new_api_id,api_name,type,status,email,customer_id,unuse_count,check_count) values (lc_current_time,5,'abc',4,1,'[email protected]',check_count,unuse_count);
        END IF;
END LOOP;
CLOSE select_cursor;
END$$
delimiter ;
  • 0
    Вы должны объяснить, что было не так и почему.
  • 0
    @PaulSpiegel: Я только что добавил информацию в ответе. Пожалуйста, подтвердите.
Показать ещё 1 комментарий
0

Если вы не использовали разделитель, попробуйте Это может помочь вам:

delimiter $$
create event api_5 ON SCHEDULE EVERY 360 SECOND DO
BEGIN
DECLARE lc_current_time DATETIME;
DECLARE unuse_count INT;
DECLARE auto_assign TINYINT;
DECLARE total_sum INT;
DECLARE check_count INT;
SET lc_current_time = CONVERT_TZ(NOW(), @@session.time_zone, '+0:00');

DECLARE select_cursor CURSOR FOR SELECT unuse_count,auto_assign,total_sum,check_count from new_api;

OPEN select_cursor;
LOOP
     FETCH select_cursor INTO unuse_count,auto_assign,total_sum,check_count
     if(unuse_count <= check_count){
        insert into api_report(date,new_api_id,api_name,type,status,email,customer_id,unuse_count,check_count) values (lc_current_time,5,'abc',4,1,'[email protected]',check_count,unuse_count);
        }
     END;
END LOOP;
CLOSE select_cursor;
END
delimiter ;
  • 0
    Этот также выбрасывает ту же ошибку, что и вторая ошибка

Ещё вопросы

Сообщество Overcoder
Наверх
Меню