sql >> Databasteknik >  >> RDS >> Mysql

Hur skapar man en lagrad procedur som innehåller en DELIMITER i PHP med PDO?

Från kommentarer:

Det är inte så det fungerar.

För att förstå varför måste du förstå hur mysql CLI -- och alla andra program som kan läsa och köra en dumpfil som denna -- hanterar det faktiskt.

DELIMITER är inget som servern förstår.

DELIMITER används för att berätta för klientsidans parser vad den aktuella satsavgränsaren ska vara, så att klientsidans parser korrekt kan dela satserna och leverera en åt gången till servern för exekvering.

Från dokumenten. Observera noga att mysql , varje gång den används här, refererar till mysql klientverktyg -- inte servern.

Så för att hantera en sådan fil behöver du en klient-side parser som gör samma sak mysql gör... och här är koden du skriver är (behöver vara) programsatsparsern på klientsidan. Så du är den som behöver skriva logiken för att hantera avgränsaren.

För att göra vad du vill måste du tolka DELIMITER satser, använd dem för att hålla reda på den aktuella satsavgränsaren, men skicka dem inte till servern.

Sedan måste du läsa igenom inmatningen en rad i taget, buffra det du har läst, tills du hittar den angivna avgränsaren i slutet av raden, och skicka den resulterande satsen till servern -- exklusive den faktiska satsavgränsaren från det du skickar... så att du till exempel inte skulle skicka slutet $$ efter procedurens brödtext (såvida inte den aktuella satsavgränsaren är ; , som du antingen kan skicka eller inte skicka -- servern bryr sig inte.) Töm sedan bufferten och börja läsa igen tills du ser en annan instans av en avgränsare (och skickar satsen till servern) eller matchar en DELIMITER sats och ställ in din kods aktuella avgränsningsvariabel så att den matchar den så att du korrekt identifierar slutet av nästa sats.



  1. phpActiveRecord Felaktigt DateTimeFormat

  2. MySQL - I SELECT-satsen

  3. Hur man löser detta datauppdateringsfel i Laravel

  4. JOIN med applikationsnivå med WHERE och BESTÄLL AV på N postgresql-skärvor