Procedura składowana

Zapisany w bazie zestaw poleceń SQL, który można wielokrotnie wywoływać. Pozwala umieścić logikę po stronie serwera bazy.

Procedura składowana (ang. stored procedure) to nazwany zestaw poleceń SQL zapisany wewnątrz bazy danych, który wywołujesz jednym poleceniem zamiast przepisywać całą logikę za każdym razem w aplikacji. Możesz przekazać do niej parametry, w środku umieścić kilka zapytań, warunki IF, pętle, transakcje, a na końcu zwrócić wynik albo zmodyfikować dane. Krótko: kawałek logiki mieszka po stronie serwera bazy, a nie w kodzie aplikacji.

Jak to działa i po co

Procedurę definiujesz raz (np. CREATE PROCEDURE), a baza ją zapamiętuje i — w wielu silnikach — przechowuje gotowy plan wykonania. Dzięki temu kolejne wywołania nie muszą od nowa parsować i optymalizować zapytania. Z aplikacji odpalasz ją prostym CALL (MySQL, PostgreSQL) albo EXEC (SQL Server), zamiast przesyłać po sieci długi tekst SQL.

Zyskujesz kilka rzeczy naraz: mniej ruchu między aplikacją a bazą, jedno miejsce z logiką (zamiast pięciu kopii rozsianych po kodzie) i kontrolę uprawnień — możesz dać komuś prawo do wywołania procedury, nie dając mu bezpośredniego dostępu do tabel.

Przykład z praktyki

Załóżmy, że w PostgreSQL chcesz raportować nowego użytkownika. Zamiast trzymać INSERT w kodzie, robisz:

CREATE PROCEDURE add_user(p_email text) LANGUAGE SQL AS $$ INSERT INTO users(email) VALUES (p_email); $$;

i wołasz CALL add_user('[email protected]');. Gdy zmieni się reguła (np. trzeba zapisywać też datę rejestracji), poprawiasz procedurę w jednym miejscu, a wszystkie aplikacje korzystające z bazy dostają zmianę za darmo.

Częste błędy i mity

  • Mylenie z funkcją. Funkcja (FUNCTION) zwraca wartość i używasz jej w SELECT; procedura służy do wykonania akcji i wywołujesz ją osobno. W PostgreSQL tylko procedura może zarządzać transakcjami (COMMIT w środku).
  • Upychanie całej logiki biznesowej w bazie. Kuszące, dopóki nie trzeba tego wersjonować, testować i debugować — narzędzia do tego są dużo uboższe niż dla zwykłego kodu.
  • Mit „procedura = automatycznie szybciej”. Zysk bywa realny, ale na skomplikowanej logice z pętlami potrafi być wolniejsza niż dobrze napisane pojedyncze zapytanie.

Pojęcia powiązane: funkcja składowana (stored function), trigger (wyzwalacz), widok (view), transakcja, plan wykonania zapytania oraz PL/pgSQL i T-SQL — proceduralne rozszerzenia SQL.