Определение функции неправильно передано в базу данных MySQL с помощью MySQL Workbench - PullRequest
0 голосов
/ 13 декабря 2011

Я использую MySQL 5.5 (x64) и MySQL Workbench 5.2, развернутые локально на рабочей станции Windows 7 для целей разработки. Я использовал MySQL Workbench для построения схемы со следующим определением функции:

CREATE FUNCTION `db`.`get_public_name` (GPN_entID INT) RETURNS VARCHAR(64)
DETERMINISTIC
BEGIN
    DECLARE GPN_pubName VARCHAR(64);

    SELECT public_name INTO GPN_pubName
        FROM entity WHERE id_entity=GPN_entID LIMIT 1;

    RETURN GPN_pubName;
END

Затем я пытаюсь "переадресовать инженера" ​​схему в базу данных с указанными ниже параметрами:

  • УДАЛЯТЬ объекты перед каждым созданным объектом
  • Генерировать DROP SCHEMA
  • Добавлять SHOW WARNINGS после каждого оператора DDL
  • GENERATE INSERT Утверждения для таблиц

После этого MySQL Workbench пытается опубликовать на сервере:

CREATE FUNCTION `db`.`get_public_name` (GPN_entID INT) RETURNS VARCHAR(64)
DETERMINISTIC
BEGIN
    DECLARE GPN_pubName VARCHAR(64);
    SELECT public_name FROM entity WHERE id_entity = GPN_entID;

    RETURN GPN_pubName;
END

Это приводит к следующей ошибке:

Executing SQL script in server

ERROR: Error 1415: Not allowed to return a result set from a function

При ближайшем рассмотрении я заметил, что предложения INTO и LIMIT оператора SELECT были удалены из исходного определения функции. Похоже, что это может быть кэшированная версия функции, но я перепробовал все, что только мог (за исключением удаления и переустановки MySQL Workbench), чтобы сбросить любой такой кэш для перезагрузки правильной версии, но безрезультатно.

Итак, почему происходит это изменение и как я могу предотвратить его?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

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

Оказывается, я создал две функции с одинаковым именем, и MySQL Workbench с радостью позволил мне это сделать. Я не заметил, что это было так, пока я не начал более тщательно просматривать хранимые процедуры. Я редактировал один, но другой (в котором была ошибка) никогда не менялся. Поскольку публикация каждой функции включала удаление какой-либо более ранней версии из базы данных, я, вероятно, не заметил бы этого, пока все не заработало должным образом.

0 голосов
/ 13 декабря 2011

Попробуйте перейти на это:

SELECT public_name FROM entity WHERE id_entity = GPN_entID LIMIT 1 INTO GPN_pubName;
...