От коментари:
Не става така.
За да разберете защо, трябва да разберете как mysql
CLI -- и всяка друга програма, която може да чете и изпълнява dump файл като този -- всъщност го обработва.
DELIMITER
не е нещо, което сървърът разбира.
DELIMITER
се използва за указване на синтактичния анализатор от страна на клиента какъв трябва да бъде текущият разделител на изрази, така че анализаторът от страна на клиента да може правилно да раздели изразите и да ги достави един по един на сървъра за изпълнение.
От документите. Обърнете внимание внимателно, че mysql
, всеки път, когато се използва тук, се отнася до mysql
помощна програма за клиента -- не сървъра.
Така че, за да обработите такъв файл, имате нужда от анализатор от страна на клиента, който прави същото нещо mysql
прави... и тук кодът, който пишете, е (трябва да бъде) анализатор на изявления от страна на клиента. Така че вие сте този, който трябва да напише логиката за работа с разделителя.
За да направите това, което искате, трябва да интерпретирате DELIMITER
изрази, използвайте ги, за да следите текущия разделител на изрази, но не ги изпращайте на сървъра.
След това трябва да прочетете входа ред по ред, като буферирате това, което сте прочели, докато намерите указания разделител в края на реда и изпратите резултантния оператор на сървъра -- excluding действителният разделител на оператора от това, което изпращате... така че, например, не бихте изпратили края $$
след тялото на процедурата (освен ако разделителят на текущия израз е ;
, който можете или да изпратите, или да не изпратите - сървърът не се интересува.) След това изпразнете буфера и започнете да четете отново, докато видите друг екземпляр на разделител (и изпратите оператора на сървъра) или съответства на DELIMITER
и задайте текущата разделителна променлива на вашия код, за да съответства на нея, така че да идентифицирате правилно края на следващия израз.