Perché SQLyog cambia delimitatore quando si crea MySQL stored procedure?
-
27-10-2019 - |
Domanda
Quando faccio una stored procedure con SQLyog, mi dà questo template:
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 ;
Mi chiedo perché cambia delimitatore prima di creare stored procedure. E perché posso ancora usare ;
delimitatore all'interno della dichiarazione create
(immagino che maggio a causa del campo di applicazione).
Soluzione
che cambia il delimitatore dichiarazione $$
per mantenere MySQL da cercare di interpretare qualsiasi virgola all'interno della stored procedure come delimitatore. Senza il DELIMITER $$
, non sarebbe in grado di definire una stored procedure che conteneva ;
per delimitare le dichiarazioni al suo interno. Si può pensare ad esso come un modo per sfuggire a livello globale il punto e virgola per tutta la durata della definizione del procedimento.
Per ridefinire il mysql delimitatore, utilizzare il comando
delimiter
. L'esempio seguente mostra come fare questo per la procedura didorepeat()
appena mostrato. Il delimitatore viene modificata per//
per consentire l'intera definizione per essere passato al server come una singola istruzione, e poi ripristinato;
prima di invocare la procedura. Ciò consente il delimitatore;
utilizzato nel corpo procedura da passare attraverso il server piuttosto che essere interpretato dalla mysql stessa.
Non so se la mia spiegazione è più chiaro rispetto del manuale, ma forse uno di essi (o entrambi combinati) si tradurrà in una certa comprensione.