Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment créer une procédure stockée contenant un DELIMITER en PHP avec PDO ?

À partir des commentaires :

Ce n'est pas comme ça que ça marche.

Pour comprendre pourquoi, vous devez comprendre comment le mysql CLI - et tout autre programme capable de lire et d'exécuter un fichier de vidage comme celui-ci - le gère en fait.

DELIMITER n'est pas quelque chose que le serveur comprend.

DELIMITER est utilisé pour indiquer à l'analyseur côté client quel doit être le délimiteur d'instructions actuel, afin que l'analyseur côté client puisse correctement diviser les instructions et les livrer une par une au serveur pour exécution.

De la doc. Notez bien que mysql , chaque fois qu'il est utilisé ici, fait référence au mysql utilitaire client -- pas le serveur.

Donc, pour gérer un tel fichier, vous avez besoin d'un analyseur côté client qui fait la même chose mysql fait... et ici, le code que vous écrivez est (doit être) l'analyseur d'instructions côté client. C'est donc vous qui devez écrire la logique pour gérer le délimiteur.

Pour faire ce que vous voulez, vous devez interpréter le DELIMITER instructions, utilisez-les pour garder une trace du délimiteur d'instruction actuel, mais ne les envoyez pas au serveur.

Ensuite, vous devez lire l'entrée une ligne à la fois, en mettant en mémoire tampon ce que vous avez lu, jusqu'à ce que vous trouviez le délimiteur spécifié à la fin de la ligne, et envoyez l'instruction résultante au serveur -- excluant le délimiteur de déclaration réel de ce que vous envoyez... ainsi, par exemple, vous n'enverriez pas la fin $$ après le corps de la procédure (sauf si le délimiteur d'instruction actuel est ; , que vous pouvez envoyer ou non -- le serveur ne s'en soucie pas.) Ensuite, videz le tampon et recommencez la lecture jusqu'à ce que vous voyiez une autre instance d'un délimiteur (et envoyez l'instruction au serveur) ou correspondiez à un DELIMITER instruction et définissez la variable de délimitation actuelle de votre code pour qu'elle corresponde afin d'identifier correctement la fin de l'instruction suivante.