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.