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).

Était-ce utile?

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.

De fin manuel:

Redéfinir mysql delimiter, utilisez la commande delimiter. L'exemple suivant montre comment le faire pour la procédure de dorepeat() 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top