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

È stato utile?

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.

fine manuale :

Per ridefinire il mysql delimitatore, utilizzare il comando delimiter. L'esempio seguente mostra come fare questo per la procedura di dorepeat() 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top