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 wSELECT; procedura służy do wykonania akcji i wywołujesz ją osobno. W PostgreSQL tylko procedura może zarządzać transakcjami (COMMITw ś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.