Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erstelle ich eine gespeicherte Prozedur, die ein DELIMITER in PHP mit PDO enthält?

Aus Kommentaren:

So funktioniert es nicht.

Um zu verstehen, warum, müssen Sie verstehen, wie die mysql CLI – und jedes andere Programm, das eine Dump-Datei wie diese lesen und ausführen kann – handhabt sie tatsächlich.

DELIMITER ist etwas, was der Server nicht versteht.

DELIMITER wird verwendet, um dem clientseitigen Parser mitzuteilen was das aktuelle Anweisungstrennzeichen sein sollte, damit der clientseitige Parser die Anweisungen korrekt aufteilen und eine nach der anderen zur Ausführung an den Server liefern kann.

Aus den Dokumenten. Beachten Sie sorgfältig, dass mysql bezieht sich jedes Mal, wenn es hier verwendet wird, auf mysql Client-Dienstprogramm -- nicht der Server.

Um eine solche Datei zu verarbeiten, benötigen Sie also einen clientseitigen Parser, der dasselbe tut mysql tut ... und hier ist der Code, den Sie schreiben, ist (muss sein) der clientseitige Anweisungsparser. Sie sind also derjenige, der die Logik zur Behandlung des Trennzeichens schreiben muss.

Um zu tun, was Sie wollen, müssen Sie das DELIMITER interpretieren verwenden Sie sie, um das aktuelle Anweisungstrennzeichen zu verfolgen, aber senden Sie sie nicht an den Server.

Dann müssen Sie die Eingabe Zeile für Zeile durchlesen, das Gelesene puffern, bis Sie das angegebene Trennzeichen am Ende der Zeile finden, und die resultierende Anweisung an den Server senden -- exclusiv das eigentliche Anweisungstrennzeichen von dem, was Sie senden ... also würden Sie zum Beispiel nicht die Endung $$ senden nach dem Prozedurhauptteil (es sei denn, das aktuelle Anweisungstrennzeichen ist ; , die Sie entweder senden oder nicht senden können -- dem Server ist es egal.) Leeren Sie dann den Puffer und beginnen Sie erneut mit dem Lesen, bis Sie eine weitere Instanz eines Trennzeichens sehen (und die Anweisung an den Server senden) oder einen DELIMITER -Anweisung und stellen Sie die aktuelle Trennzeichenvariable Ihres Codes so ein, dass sie mit ihr übereinstimmt, sodass Sie das Ende der nächsten Anweisung korrekt identifizieren.