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

Come creare una procedura memorizzata contenente un DELIMITER in PHP con PDO?

Dai commenti:

Non è così che funziona.

Per capire perché, devi capire come funziona mysql CLI -- e qualsiasi altro programma in grado di leggere ed eseguire un file dump come questo -- lo gestisce effettivamente.

DELIMITER non è qualcosa che il server capisce.

DELIMITER viene utilizzato per comunicare al parser lato client quale dovrebbe essere il delimitatore dell'istruzione corrente, in modo che il parser lato client possa dividere correttamente le istruzioni e inviarne una alla volta al server per l'esecuzione.

Dai documenti. Nota attentamente che mysql , ogni volta che viene utilizzato qui, fa riferimento a mysql utilità client -- non il server.

Quindi, per gestire un file del genere, hai bisogno di un parser lato client che faccia la stessa cosa mysql fa... e qui, il codice che stai scrivendo è (deve essere) il parser di istruzioni lato client. Quindi sei tu quello che deve scrivere la logica per gestire il delimitatore.

Per fare quello che vuoi, devi interpretare il DELIMITER istruzioni, usale per tenere traccia del delimitatore di istruzione corrente, ma non inviarle al server.

Quindi, devi leggere l'input una riga alla volta, memorizzando nel buffer ciò che hai letto, fino a trovare il delimitatore specificato alla fine della riga e inviare l'istruzione risultante al server -- escludendo l'effettivo delimitatore dell'istruzione da ciò che invii... quindi, ad esempio, non invierai la desinenza $$ dopo il corpo della procedura (a meno che il delimitatore dell'istruzione corrente sia ; , che puoi inviare o meno - al server non importa.) Quindi svuota il buffer e ricomincia a leggere finché non vedi un'altra istanza di un delimitatore (e invia l'istruzione al server) o corrisponde a un DELIMITER istruzione e imposta la variabile delimitatore corrente del tuo codice in modo che corrisponda ad essa in modo da identificare correttamente la fine dell'istruzione successiva.