Uit opmerkingen:
Zo werkt het niet.
Om te begrijpen waarom, moet u begrijpen hoe de mysql
CLI -- en elk ander programma dat een dumpbestand als dit kan lezen en uitvoeren -- verwerkt het feitelijk.
DELIMITER
is niet iets wat de server begrijpt.
DELIMITER
wordt gebruikt om de client-side parser . te vertellen wat het huidige scheidingsteken voor instructies zou moeten zijn, zodat de parser aan de clientzijde de instructies correct kan splitsen en één voor één aan de server kan leveren voor uitvoering.
Uit de documenten. Let goed op dat mysql
, elke keer dat het hier wordt gebruikt, verwijst naar de mysql
clienthulpprogramma -- niet de server.
Dus om zo'n bestand te verwerken, heb je een client-side parser nodig die hetzelfde doet mysql
doet... en hier, de code die u schrijft is (moet zijn) de statement-parser aan de clientzijde. Dus jij bent degene die de logica moet schrijven om het scheidingsteken te verwerken.
Om te doen wat je wilt, moet je de DELIMITER
. interpreteren uitspraken, gebruik ze om het huidige scheidingsteken voor uitspraken bij te houden, maar stuur ze niet naar de server.
Vervolgens moet je de invoer regel voor regel doorlezen, bufferend wat je hebt gelezen, totdat je het opgegeven scheidingsteken aan het einde van de regel vindt, en de resulterende instructie naar de server sturen -- exclusief het feitelijke scheidingsteken voor de verklaring van wat u verzendt ... dus u zou bijvoorbeeld niet het einde $$
verzenden na de hoofdtekst van de procedure (tenzij het huidige scheidingsteken voor de instructie ;
, die u kunt verzenden of niet kunt verzenden - de server maakt het niet uit.) Leeg vervolgens de buffer en begin opnieuw te lezen totdat u een ander exemplaar van een scheidingsteken ziet (en de instructie naar de server verzendt) of een DELIMITER
statement en stel de huidige scheidingstekenvariabele van je code in zodat je het einde van het volgende statement correct identificeert.