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.

Kategorie: DatabázeAktualizováno

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

  1. 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; $$;
  2. 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

  1. CREATE PROCEDURE(otevře se v novém okně)PostgreSQL Global Development Group
  2. CREATE PROCEDURE (Transact-SQL)(otevře se v novém okně)Microsoft
  3. Stored procedure(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.