Продолжайте получать 1064 с MariaDB / MySQL - PullRequest
0 голосов
/ 12 октября 2018

Я изо всех сил пытаюсь получить приведенный ниже триггер для компиляции с моей базой данных.Прямо сейчас его MariaDB v5.5.56.Я пробовал этот синтаксис в онлайн-валидаторах, и вот результаты:

SQLFiddle:

  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 4

https://www.eversql.com/sql-syntax-check-validator/

 Great work, the query's syntax is valid!

https://rextester.com/l/mysql_online_compiler

 Compiles with no errors

В моей среде я получаю:

 Error Code: 1064. 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 4.

Кажется, моя ошибка совпадает с ошибкой SQLFiddle ... но странно, что другие парсеры работали просто отлично.Может быть, что-то не так с моим синтаксисом, основанным на моей версии БД?

Вот что я пытаюсь выполнить:

 CREATE TRIGGER insert_pad
 BEFORE INSERT on vehicles FOR EACH ROW
 BEGIN
 DECLARE done INT DEFAULT FALSE;
 DECLARE localid CHAR(17);
 DECLARE veh_mod CHAR(17);
 DECLARE cur1 CURSOR FOR select id, RPAD(vin, 17,'Q') from   vehicles where length(rtrim(vin)) < 17;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

 OPEN cur1;

 read_loop: LOOP
 FETCH cur1 INTO localid, veh_mod;

 IF done THEN
  LEAVE read_loop;
 END IF;
 UPDATE vehicles SET vin = veh_mod WHERE id = localid;


 END LOOP;

 CLOSE cur1;

 END;

Если у кого-то есть мысли, я бы хотел их услышать!Еще раз спасибо!

1 Ответ

0 голосов
/ 12 октября 2018

Я не вижу изменений в разделителе.Без этого точка с запятой в строке 4 будет завершать оператор, и это приведет к ошибке.

Оператор DELIMITER изменяет разделитель оператора.Мы хотим изменить это на некоторую строку, которая не появляется в операторе, который мы хотим выполнить.В этом примере мы изменили разделитель на два знака доллара, а затем изменили его на точку с запятой по умолчанию.

DELIMITER $$

CREATE TRIGGER insert_pad
BEFORE INSERT on vehicles FOR EACH ROW
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE localid CHAR(17);
  ...
END$$

DELIMITER ;

Еще одна мысль: я не думаю, что триггеру разрешено выдавать DML(вставка / обновление / удаление) для таблицы, на которую ссылается оператор, вызывающий срабатывание триггера.

Но в триггере BEFORE INSERT нам разрешено ссылаться и изменять значения столбцов строкиэто собирается быть вставленным.Мы используем специальный квалификатор NEW. для ссылки на столбцы в вставляемой строке.Например:

 DELIMITER $$

 CREATE TRIGGER insert_pad
 BEFORE INSERT ON vehicles FOR EACH ROW
 BEGIN
   -- if vin less than 17 characters, pad with Q  
   IF( CHAR_LENGTH(TRIM( NEW.vin )) < 17 ) THEN
     SET NEW.vin = RPAD(TRIM( NEW.vin ), 17,'Q');
   END IF;
 END$$

 DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...