sql >> Database teknologi >  >> RDS >> Mysql

Hvordan opretter man en lagret procedure, der indeholder en DELIMITER i PHP med PDO?

Fra kommentarer:

Sådan fungerer det ikke.

For at forstå hvorfor, skal du forstå, hvordan mysql CLI -- og ethvert andet program, der kan læse og udføre en dumpfil som denne -- håndterer det faktisk.

DELIMITER er ikke noget, serveren forstår.

DELIMITER bruges til at fortælle klientsideparseren hvad den aktuelle sætningsafgrænser skal være, så klient-side-parseren korrekt kan opdele sætningerne og levere én ad gangen til serveren til udførelse.

Fra dok. Bemærk nøje, at mysql , hver gang det bruges her, henviser til mysql klientværktøj -- ikke serveren.

Så for at håndtere en sådan fil, har du brug for en klient-side parser, der gør det samme mysql gør... og her er koden du skriver er (skal være) sætningsparseren på klientsiden. Så det er dig, der skal skrive logikken for at håndtere afgrænsningen.

For at gøre, hvad du vil, skal du fortolke DELIMITER sætninger, brug dem til at holde styr på den aktuelle sætningsadskiller, men send dem ikke til serveren.

Derefter skal du gennemlæse input en linje ad gangen, buffere det du har læst, indtil du finder den angivne afgrænsning i slutningen af ​​linjen, og sende den resulterende sætning til serveren -- eksklusive den faktiske sætningsadskiller fra det, du sender... så du for eksempel ikke ville sende endelsen $$ efter procedureteksten (medmindre den aktuelle sætningsadskiller er ; , som du enten kan sende eller ikke sende -- serveren er ligeglad.) Tøm derefter bufferen og begynd at læse igen, indtil du ser en anden forekomst af en afgrænser (og sender erklæringen til serveren) eller matcher en DELIMITER sætning og indstil din kodes aktuelle afgrænsningsvariabel til at matche den, så du korrekt identificerer slutningen af ​​den næste sætning.



  1. Skift fra mysql til mysqli kodefejl

  2. Sådan fungerer STR_TO_DATE() i MariaDB

  3. Hvorfor påvirker Django-tidszoneindstillingen epoketid?

  4. Hvordan gemmer man resultatet af en funktion, der returnerer sysrefcursor?