Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak stworzyć procedurę składowaną zawierającą DELIMITER w PHP z PDO?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bardzo proste zapytanie agregujące AVG() na serwerze MySQL zajmuje absurdalnie dużo czasu

  2. Przecięcie geometrii MySQL daje nieprzecinające się wyniki

  3. Znajdź całkowitą liczbę wyników w zapytaniu mySQL z przesunięciem+limit

  4. sql usuń wszystkie wiersze starsze niż 30 dni

  5. Automatyczne wypełnianie kraju i miasta z kodu pocztowego i odwrotnie