Сбой функции MYSQL – Ошибка SQL: (1064)

Это мой набор изменений Liquibase:

<changeSet author = "user" id = "1712203200334-1">    
    <sqlFile path = "config/liquibase/IsValidCoordinatesFormat.sql"/>    
</changeSet>

Это файл config/liquibase/IsValidCoordinatesFormat.sql:

CREATE FUNCTION IsValidCoordinatesFormat(coordString VARCHAR(255)) RETURNS BOOLEAN
DETERMINISTIC
BEGIN
  DECLARE isValid BOOLEAN;
  DECLARE regex VARCHAR(255);
  SET isValid = FALSE;

  SET regex = '^(-?\\d+(\\.\\d+)?);(-?\\d+(\\.\\d+)?)$';

  IF coordString REGEXP regex THEN
    SET isValid = TRUE;
  END IF;

  RETURN isValid;
END;

И это ошибка, которую я получаю

Reason: liquibase.exception.DatabaseException: 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 12 [Failed SQL: (1064) CREATE FUNCTION IsValidCoordinatesFormat(coordString VARCHAR(255)) RETURNS BOOLEAN
2024-04-04 08:00:53 DETERMINISTIC
2024-04-04 08:00:53 BEGIN
2024-04-04 08:00:53   DECLARE isValid BOOLEAN;
2024-04-04 08:00:53   DECLARE regex VARCHAR(255);
2024-04-04 08:00:53   SET isValid = FALSE;
2024-04-04 08:00:53 
2024-04-04 08:00:53   SET regex = '^(-?\\d+(\\.\\d+)?);(-?\\d+(\\.\\d+)?)$';
2024-04-04 08:00:53 
2024-04-04 08:00:53   IF coordString REGEXP regex THEN
2024-04-04 08:00:53     SET isValid = TRUE;
2024-04-04 08:00:53   END IF]

Синтаксис SQL мне кажется правильным. Что вызывает проблему?

Что вызывает проблему? Настройки метода выполнения. Если вы хотите создать составной оператор, вам необходимо переопределить разделитель. Если нет, то сервер не может определить, завершает ли какой-либо ; весь код создания объекта или является частью этого кода и завершает один оператор. С другой стороны, вы можете легко преобразовать свою сложную функцию в однооператорную форму, большая часть вашего кода является лишней.

Akina 04.04.2024 08:52

Как отметил Акина, этот случай можно исправить, переписав функцию с одним оператором. В случаях, когда вам нужно иметь несколько операторов в теле подпрограммы, вы можете использовать endDelimiter.

user1191247 04.04.2024 09:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Большая часть вашего кода является лишней. Используйте код функции с одним оператором, который не требует изменения разделителя:

CREATE FUNCTION IsValidCoordinatesFormat(coordString VARCHAR(255)) 
RETURNS BOOLEAN
DETERMINISTIC
RETURN COALESCE(coordString REGEXP '^(-?\\d+(\\.\\d+)?);(-?\\d+(\\.\\d+)?)$', FALSE);

Если вы гарантируете, что coordString не будет NULL или NULL, поскольку в этом случае вывод функции безопасен для вас, вы можете удалить COALESCE().

Другие вопросы по теме