Z komentarzy:
To tak nie działa.
Aby zrozumieć dlaczego, musisz zrozumieć, jak mysql
CLI – i każdy inny program, który potrafi odczytać i wykonać taki plik zrzutu – faktycznie go obsługuje.
DELIMITER
nie jest czymś, co serwer rozumie.
DELIMITER
służy do informowania parsera po stronie klienta jaki powinien być bieżący ogranicznik instrukcji, aby parser po stronie klienta mógł prawidłowo podzielić instrukcje i dostarczać je pojedynczo do serwera w celu wykonania.
Z dokumentów. Zwróć uwagę, że mysql
, za każdym razem, gdy jest tutaj użyty, odnosi się do mysql
narzędzie klienta -- nie serwer.
Tak więc, aby obsłużyć taki plik, potrzebujesz parsera po stronie klienta, który robi to samo mysql
robi... a tutaj kod, który piszesz jest (musi być) parserem instrukcji po stronie klienta. Więc to ty musisz napisać logikę obsługi ogranicznika.
Aby zrobić to, co chcesz, musisz zinterpretować DELIMITER
wyciągów, używaj ich do śledzenia bieżącego ogranicznika wyciągów, ale nie wysyłaj ich na serwer.
Następnie musisz czytać dane wejściowe po jednym wierszu na raz, buforując to, co przeczytałeś, aż znajdziesz określony ogranicznik na końcu wiersza i wysłać wynikową instrukcję na serwer -- wykluczając faktyczny ogranicznik wyciągu od tego, co wysyłasz... więc na przykład nie wysyłasz końcowego $$
po treści procedury (chyba że bieżący ogranicznik instrukcji to ;
, który możesz wysłać lub nie wysłać — serwer nie dba o to.) Następnie opróżnij bufor i zacznij czytać ponownie, aż zobaczysz kolejną instancję ogranicznika (i wyślesz instrukcję do serwera) lub dopasujesz DELIMITER
instrukcji i ustaw bieżącą zmienną ogranicznika kodu tak, aby pasowała do niej, tak aby poprawnie zidentyfikować koniec następnej instrukcji.