Pourquoi SQLYog change delimiter quand il crée MySQL procédure stockée?
-
27-10-2019 - |
Question
Quand je fais une procédure stockée avec SQLYog, il me donne ce modèle:
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `apachelogs`.`test`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
END$$
DELIMITER ;
Je me demande pourquoi il change delimiter avant de créer une procédure stockée. Et pourquoi je ne peux toujours utiliser delimiter ;
à l'intérieur de la déclaration de create
(je suppose qu'il peut en raison de la portée).
La solution
Cela change le délimiteur d'instruction à $$
de garder MySQL d'essayer d'interpréter les points-virgules dans la procédure stockée comme séparateur. Sans le DELIMITER $$
, vous ne seriez pas en mesure de définir une procédure stockée qui contient ;
Délimiter des déclarations à l'intérieur. Vous pouvez penser comme un moyen d'échapper à l'échelle mondiale le point-virgule pour la durée de la définition de la procédure.
Redéfinir mysql delimiter, utilisez la commande
delimiter
. L'exemple suivant montre comment le faire pour la procédure dedorepeat()
vient de le montrer. Le séparateur est modifié pour//
pour permettre la définition entière à transmettre au serveur comme une déclaration unique, puis restauré à;
avant d'invoquer la procédure. Cela permet au delimiter;
utilisé dans le corps de la procédure à passer par le serveur plutôt que d'être interprété par mysql lui-même.
Je ne sais pas si mon explication est plus clair que les manuels de mais peut-être l'un d'entre eux (ou les deux combinés) se traduira par une certaine compréhension.