Uložená procedura
Uložená procedura (anglicky stored procedure) je databázový objekt, který neobsahuje data, ale část programu, který se nad daty v databázi má vykonávat.
Popis
Uložená procedura je především procedura. Jedná se o část programu, který je (nebo by alespoň měl být) jasně funkčně oddělený od svého okolí, má interface (seznam parametrů) pro komunikaci s jinými moduly programu. Může mít vlastní lokální proměnné neviditelné pro ostatní části programu.
Uložená procedura je uložená (rozuměj: uložená v databázi). To znamená, že se k ní lze chovat stejně jako ke každému jinému objektu databáze (indexu, pohledu, triggeru apod.). Lze jí založit, upravovat a smazat pomocí příkazů dotazovacího jazyka databáze (v případě relační databáze obvykle pomocí příkazů DDL SQL). Deklarace uložené procedury je vždy „uložena“ v databázi - vlastní definice pak v databázi být uložena nemusí - příkladem jsou tzv. externí procedury, kdy v deklaraci je uveden pouze odkaz do externí knihovny.
Pro psaní uložených procedur je obvykle používán specifický jazyk konkrétní databáze, který je buďto rozšířením jejího dotazovacího jazyka (např. T-SQL) nebo specifický procedurální jazyk s podporou SQL (hezkým příkladem je pro databázi Oracle procedurální jazyk PL/SQL - v tomto případě se jedná o programovací jazyk ADA rozšířený o SQL). ANSI SQL obsahuje část věnovanou uloženým procedurám - definuje programovací jazyk SQL/PSM, který je např. použit v SQL serverech DB2 nebo MySQL. Většina moderních databázových systémů podporuje implementaci uložených procedur i v klasických programovacích jazycích - Java, C#, C a dalších - a to v těch případech, kdy nám specifické jazyky z důvodů omezené funkčnosti nebo výkonu nevyhovují.
Vlastnosti
Výhody
Oproti obvyklejšímu přístupu, kdy s daty pracuje přímo vlastní aplikace přistupující k databázi prostřednictvím SQL, uložené procedury jsou vykonávány přímo databázovým serverem. To může být v mnoha situacích velmi výhodné:
- Sdílení kódu: Relativně komplexní kód uložené procedury může být sdílen a využíván více aplikacemi přistupujícími k databázi, aniž by činnost procedury musela být implementována opakovaně v jednotlivých aplikacích. Zejména se tato výhoda projeví, pokud jsou jednotlivé aplikace vyvíjeny v různých programovacích jazycích.
- Jednoduché rozhraní: Ve vhodných případech může vést užití uložené procedury ke značnému zjednodušení rozhraní mezi aplikací a databází. Pokud aplikace k příslušným datům v databázi přistupuje výhradně voláním uložených procedur, pak je možné do značné míry měnit schéma databáze (včetně uložených procedur, avšak bez změn v rozhraní uložených procedur), aniž by si taková změna vyžádala změnu v kódu samotné aplikace.
- Opravitelnost: Mnohé chyby v kódu uložené procedury se dají opravovat bez nutnosti distribuovat a instalovat nové verze aplikace přistupující k databázi.
- Menší přesuny dat: Pokud aplikace přímo manipuluje s daty v databázi takovým způsobem, který se nedá přímo vyjádřit v jazyce SQL, pak bez použití uložené procedury musí nejdříve všechna relevantní data z databáze vybrat (typicky jedním nebo více příkazy
SELECT
), upravit je do požadované podoby a poté je uložit zpět do databáze (typicky jedním nebo více příkazyUPDATE
aINSERT
). Uložená procedura v takovém případě může ušetřit přenosy dat mezi databázovým serverem a aplikací v obou směrech. Zejména v případě, že aplikace běží na jiném počítači než databáze, může být rozdíl v čase a v zatížení sítě markantní.
- Binární kompatibilita a uložené prováděcí plány - Implementačně je snaha docílit kompatibility formátů dat používaných tzv. SQL jazyky (T-SQL, PL/SQL, PL/pgSQL, SQL/PSM) s formáty používanými v SQL serveru. Tím odpadá nutnost konverzí formátů a radikálnímu snížení zátěže procesoru. V těchto programovacích jazycích také dochází k automatickému převodu SQL příkazů na tzv prepared statements - což zrychluje opakované provádění těchto příkazů a představuje spolehlivou ochranu proti SQL injection.
Nevýhody
- Jazyky uložených procedur jsou obecně mezi různými databázovými servery navzájem nekompatibilní (SQL/PSM definované standardem zdaleka není široce rozšířeným jazykem). Některé databázové servery nepodporují uložené procedury vůbec.
- Většinou jsou prostředky pro ladění kódu uložených procedur chudší než nástroje k ladění ve všestrannějších a rozšířenějších jazycích.