Takéstored proc, database procedurePokročilý
Definice
Stored procedure je pojmenovaný blok databázového kódu uložený přímo v systému řízení databáze a spouštěný příkazem z aplikace, jiného SQL nebo plánované úlohy. Typicky uzavírá opakovanou změnu dat, validaci nebo dávkové zpracování, takže logika běží blízko dat a pod jedním transakčním i bezpečnostním modelem.
Proč databáze nabízí vlastní procedury
Databázový server umí kromě dotazů uchovávat i pojmenované programy. Stored procedure dává smysl tam, kde se stejná posloupnost SQL příkazů používá z více míst, musí proběhnout v přesném pořadí nebo má zůstat pod kontrolou databázových práv. Aplikace pak neodesílá celý postup krok za krokem, ale zavolá proceduru s parametry. Výsledkem může být změna dat, vrácení řádků, zapsání auditu nebo kombinace těchto akcí.
Co se při volání procedury děje
Volání procedury předá databázi název a vstupní hodnoty. Databázový systém najde uložený kód, ověří oprávnění volajícího, vyhodnotí plán provedení a spustí příkazy uvnitř. Konkrétní jazyk závisí na platformě: PostgreSQL používá mimo jiné PL/pgSQL, SQL Server T-SQL a Oracle PL/SQL. Procedura může mít větvení, cyklus, práci s výjimkami i lokální proměnné, takže nejde jen o uložený text jednoho dotazu.
Transakce, práva a hranice odpovědnosti
Procedura často sedí na hranici mezi aplikační logikou a datovým modelem. Silnou stránkou je blízkost k datům: menší přenos mezi aplikací a databází, jednotné vynucení pravidel a možnost udělit aplikaci právo pouze na volání procedury, ne na přímou změnu tabulek. Slabou stránkou je těsnější vazba na konkrétní databázový systém. Kód procedury se hůř verzujе spolu s aplikací, testování vyžaduje připravená data a přesun mezi dodavateli databází bývá dražší než u čistého SQL v aplikaci.
Dva příklady ze systému objednávek
Příklad 1: potvrzení objednávky v jedné transakci
E-shop potřebuje po platbě snížit sklad, označit objednávku jako zaplacenou a zapsat auditní událost. Stored procedure provede všechny kroky na serveru, takže se mezi jednotlivými příkazy neztratí stav aplikace. Pokud snížení skladu selže, transakce se může vrátit a objednávka nezůstane napůl potvrzená.
CREATE PROCEDURE confirm_order(p_order_id integer) LANGUAGE plpgsql AS $$ BEGIN UPDATE orders SET status = 'paid' WHERE id = p_order_id; UPDATE stock s SET quantity = quantity - oi.quantity FROM order_items oi WHERE oi.order_id = p_order_id AND s.product_id = oi.product_id; INSERT INTO audit_log(order_id, event) VALUES (p_order_id, 'order_confirmed'); END; $$;Příklad 2: pravidelný výpočet denních souhrnů
Noční úloha v analytické databázi každý den přepočítá tržby po kategoriích. Stored procedure zapouzdří mazání starého souhrnu i vložení nového, takže plánovač úloh volá jen jeden příkaz. Tým nemusí kopírovat stejný SQL skript do několika servisů a změna výpočtu se provede na jednom místě.
CALL refresh_daily_sales_summary(DATE '2026-07-28');Příklady z praxe
Potvrzení objednávky
E-shop po úspěšné platbě potřebuje upravit objednávku, sklad i auditní log. Stored procedure provede všechny kroky přímo v databázi a aplikace zavolá jediný příkaz. Při chybě lze celou operaci vrátit, aby nevznikl neúplný stav.
CREATE PROCEDURE confirm_order(p_order_id integer) LANGUAGE plpgsql AS $$ BEGIN UPDATE orders SET status = 'paid' WHERE id = p_order_id; UPDATE stock s SET quantity = quantity - oi.quantity FROM order_items oi WHERE oi.order_id = p_order_id AND s.product_id = oi.product_id; INSERT INTO audit_log(order_id, event) VALUES (p_order_id, 'order_confirmed'); END; $$;Denní souhrn tržeb
Analytický tým pravidelně přepočítává denní tržby podle kategorií. Stored procedure skryje mazání starých agregací, vložení nových řádků a kontrolu vstupního data. Plánovač pak spouští stabilní rozhraní místo dlouhého skriptu v aplikaci.
CALL refresh_daily_sales_summary(DATE '2026-07-28');
Časté omyly
- MýtusStored procedury jsou vždy rychlejší než SQL z aplikace.
- Ve skutečnostiStored procedure může snížit počet komunikací mezi aplikací a databází, ale rychlost závisí na dotazech, indexech, plánu provedení a objemu dat. Špatně napsaná procedura může být pomalejší než jednoduchý parametrizovaný dotaz.
- MýtusStored procedure automaticky vyřeší SQL injection.
- Ve skutečnostiStored procedure pomáhá, pokud používá parametry a neskládá SQL z neověřených řetězců. Dynamické SQL uvnitř procedury může být zranitelné stejně jako dynamické SQL v aplikaci.
Časté dotazy
- Má být stored procedure součástí databázových migrací?
- Stored procedure patří do databázových migrací, pokud je součástí produkční logiky a její změna má být verzovaná stejně pečlivě jako změna tabulky nebo indexu. Migrační nástroj by měl umět proceduru vytvořit, upravit i nasadit ve správném pořadí vůči tabulkám, které procedura používá. Bez verzování vzniká riziko, že testovací a produkční databáze spouštějí odlišný kód se stejným názvem.
- Kdy stored procedure dává větší smysl než logika v ORM?
- Stored procedure dává větší smysl než logika v ORM hlavně pro operace, které intenzivně mění data, vyžadují pevnou transakci nebo mají být sdílené několika aplikacemi. ORM se naopak lépe hodí pro běžné načítání objektů a aplikační pravidla, která úzce souvisejí s uživatelským rozhraním nebo doménovým modelem. Praktický návrh často kombinuje obojí podle nákladů na údržbu.
- Může stored procedure vracet výsledky jako SELECT?
- Stored procedure může vracet data podobně jako dotaz, ale její hlavní účel nebývá jen čtení. Procedura může měnit tabulky, volat další procedury, zapisovat audit, pracovat s dočasnými tabulkami a řídit průběh operace pomocí podmínek. Některé databáze rozlišují procedury a funkce přísněji než jiné, proto je nutné sledovat pravidla konkrétní platformy.
- Proč stored procedure komplikuje testování?
- Stored procedure komplikuje testování tím, že test potřebuje databázový server, schéma, vstupní data a často i přesný stav transakcí nebo oprávnění. Jednotkový test aplikace obvykle nestačí, protože chyba může vzniknout uvnitř databázového jazyka. Dobrá praxe je testovat procedury integračně nad izolovanou databází a připravovat data opakovatelnými skripty.
Zdroje
- CREATE PROCEDURE(otevře se v novém okně)
- CREATE PROCEDURE (Transact-SQL)(otevře se v novém okně)
- Stored procedure(otevře se v novém okně)