Impossible de créer fonction stockée - syntaxe erronée?
-
27-10-2019 - |
Question
J'ai le problème suivant.
Je veux créer une fonction stockée qui convertit un entity_id dans le sku correspondant
Voici le code:
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
Maintenant, mon problème est que si je tire la requête que je reçois le message suivant: [Titre de fenêtre] Erreur
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
La im db en utilisant MySQL est 5.0.51a
Merci d'avance pour vos idées.
La solution
MySQL par utilisation par défaut ;
comme un séparateur, de sorte que lorsqu'il rencontre le ;
à la ligne 9:
DECLARE returnvalue varchar(50);
MySQL pense que les extrémités de commande - il tente d'exécuter:
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);
qui n'est pas valide SQL.
Définir un nouveau séparateur:
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
$$
Vous pouvez alors changer le dos delimiter avec:
DELIMITER ;
Autres conseils
Cela devrait fonctionner:
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 ;
Vous ne précisaient pas la longueur de varchar. : -)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow