MariaDB и синтаксическая ошибка пролетного пути, но не в JAVA - PullRequest
2 голосов
/ 06 января 2020

Я пытаюсь выполнить (перенести) SQL сценарии (вариант MariaDB). Я использую Flyway для запуска скриптов. Однако некоторые сценарии завершаются ошибкой ...

Сбой сценария:

CREATE TRIGGER my_cool_trigger
BEFORE UPDATE ON my_db
FOR EACH ROW
BEGIN
    DECLARE n INT;
    SET n = (SELECT COUNT(uuid) FROM my_db WHERE uuid != NEW.uuid AND a_uuid = NEW.a_uuid AND number = NEW.number AND event_id IS NULL AND t_begin < NEW.t_end AND t_end > NEW.t_begin);
    IF n > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Oof. ERROR!!!';
    END IF;
END;

Сообщение об ошибке:

Миграция cool_script. sql не удалось -------------------------------------- ---------------- SQL Состояние: 42000 Код ошибки: 1064 Сообщение: (conn = 2661) У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с '' в строке 6

Когда я пытаюсь выполнить те же сценарии до Java (они запускаются как подготовленные заявления, отправленные через JDB C в MariaDB) все идет по плану без каких-либо ошибок.

Java:

connection.prepareStatement(sql).execute();

Я действительно не могу объясни мне, почему это происходит.

1 Ответ

2 голосов
/ 07 января 2020

Оказывается, проблема заключается в том, что не используются разделители. Чтобы операторы успешно анализировали разделители, следует использовать их следующим образом:

DELIMITER //
CREATE TRIGGER my_cool_trigger
BEFORE UPDATE ON my_db
FOR EACH ROW
BEGIN
    DECLARE n INT;
    SET n = (SELECT COUNT(uuid) FROM my_db WHERE uuid != NEW.uuid AND a_uuid = NEW.a_uuid AND number = NEW.number AND event_id IS NULL AND t_begin < NEW.t_end AND t_end > NEW.t_begin);
    IF n > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Oof. ERROR!!!';
    END IF;
END//
DELIMITER ;

Причина, по которой это сработало в Java, заключалась в том, что Java prepareStatement, кажется, добавляет пользовательские разделители или что-то еще .. .

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