Не удается создать сохраненную функцию - неправильный синтаксис? - PullRequest
1 голос
/ 08 сентября 2011

У меня следующая проблема.

Я хочу создать хранимую функцию, которая преобразует entity_id в соответствующий sku

Вот код:

CREATE FUNCTION `id2sku`(`entity_id_in` INT)
    RETURNS VARCHAR
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    DECLARE returnvalue varchar(50);

    SELECT `sku` INTO returnvalue FROM catalog_product_entity WHERE entity_id = entity_id_in LIMIT 1;

    return returnvalue;
END

Теперь моя проблема, если я запускаю запрос, я получаю следующее сообщение: [Название окна] Ошибка

SQL Error (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 'LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT' at line 3

БД, которую я использую, - MySQL 5.0.51a

Заранее спасибо за ваши идеи.

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

MySQL по умолчанию использует ; в качестве разделителя, поэтому, когда он встречает ; в строке 9:

 DECLARE returnvalue varchar(50);

MySQL считает, что команда заканчивается - она ​​пытается выполнить:

CREATE FUNCTION `id2sku`(`entity_id_in` INT)
    RETURNS VARCHAR(50)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    DECLARE returnvalue varchar(50);

, который не является допустимым SQL.

Установите новый разделитель:

 DELIMITER $$

 CREATE FUNCTION `id2sku`(`entity_id_in` INT)
    RETURNS VARCHAR(50)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    DECLARE returnvalue varchar(50);

    SELECT `sku` INTO returnvalue FROM catalog_product_entity WHERE entity_id = entity_id_in LIMIT 1;

    return returnvalue;
END
$$

Затем вы можете изменить разделитель с помощью:

DELIMITER ;
2 голосов
/ 08 сентября 2011

Это должно работать:

DELIMITER $$

CREATE FUNCTION `id2sku`(`entity_id_in` INT)
    RETURNS VARCHAR(50)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    DECLARE returnvalue VARCHAR(50);

    SELECT `sku` INTO returnvalue FROM catalog_product_entity WHERE entity_id = entity_id_in LIMIT 1;

    RETURN returnvalue;

    END$$

DELIMITER ;

Вы не указали длину varchar. : -)

...