phpmyadmin ошибка при добавлении функции

314
07 апреля 2017, 22:05

Есть функция

DROP FUNCTION IF EXISTS func;
DELIMITER $$;
CREATE FUNCTION func(nameFilm varchar(200)) 
RETURNS INT 
language sql
BEGIN
    declare countRow INT default 0;
    DECLARE idRow INT DEFAULT 0;
    SELECT count(*) INTO countRow, id INTO idRow
    FROM `film`
    WHERE `name` LIKE nameFilm
    GROUP BY name;
    IF countRow > 0 THEN
        UPDATE `film` SET name = nameFilm WHERE id = idRow; 
    ELSE
        INSERT film (`name`) VALUE (nameFilm);
        SELECT id INTO idRow WHERE `name` LIKE nameFilm;
    END IF;
    RETURN idRow;
END$$;
DELIMITER ;

когда пытаюсь запустить ее через поле SQL в phpmyadmin, он выдаёт ошибки на 7,8,12,14, 16-19 строчках

в MySQL WorkBench ругается только на поле id (syntax error missing semicolon). Действительно ли ошибка в синтаксисе и можно ли вообще код запустить в phpmyadmin?

Answer 1

Ошибки в строках:

SELECT count(*) INTO countRow, id INTO idRow
INSERT film (name) VALUE (nameFilm);
SELECT id INTO idRow WHERE name LIKE nameFilm;

Правильно:

SELECT count(*), id INTO countRow, idRow
INSERT film (name) VALUES (nameFilm);
SELECT id INTO idRow FROM film WHERE name LIKE nameFilm;

Также странен запрос (без учёта ошибки синтаксиса):

SELECT count(*) INTO countRow, id INTO idRow
FROM film
WHERE name LIKE nameFilm
GROUP BY name;

Если одному id соответствует одно name - группируйте по id. Иначе - в переменную будут присвоено одно случайное из всех возможных для данного name значение.

К тому же всю эту конструкцию вместе с последующей проверкой и запросами можно заменить на один INSERT .. ON DUPLICATE KEY UPDATE.

READ ALSO
Что такое упаковка и распаковка (boxing/unboxing) и зачем?

Что такое упаковка и распаковка (boxing/unboxing) и зачем?

Что это вообще такое упаковка и распаковка (boxing/unboxing) и зачем?

302
Первая страница в Spring MVC

Первая страница в Spring MVC

Как сделать так чтобы какая та заданная страница сразу открывалась когда запускаешь Spring MVC проект в IntellijIdea?

256
Почему не видит зависимость в Gradle?

Почему не видит зависимость в Gradle?

Такая ситуация, есть репозиторий с проектом, с этим проектом работает разработчик и все работает хорошо

443