Přísně vzato, Postgres neměl uložené procedury jak je definováno ve standardu ISO/IEC před verzí 11. Termín se často používá nesprávně k označení funkcí , které poskytují stejnou funkcionalitu (a další) jako jiné RDBMS poskytují "uložené procedury". Hlavním rozdílem je zpracování transakcí.
- Jaké jsou rozdíly mezi „Uloženými procedurami“ a „Uloženými funkcemi“?
Skutečné uložené procedury jsou konečně představeny s Postgres 11:
- Kdy použít uloženou proceduru / uživatelem definovanou funkci?
Funkce jsou atomové v Postgresu a automaticky se spouští v rámci vlastní transakce, pokud není volána v rámci vnější transakce. Vždy probíhají v rámci jedné transakce a zcela uspějí nebo selžou . V důsledku toho nelze zahájit nebo potvrdit transakce v rámci funkce. A příkazy jako VACUUM
, CREATE DATABASE
nebo CREATE INDEX CONCURRENTLY
které se nespouštějí v kontextu transakce nejsou povoleny.
Manuál pro PL/pgSQL:
Funkce a spouštěcí procedury se vždy provádějí v rámci transakce vytvořené vnějším dotazem — nemohou tuto transakci spustit nebo potvrdit, protože by pro ně neexistoval žádný kontext, v němž by se mohly spustit. Blok obsahující
EXCEPTION
clauseeffectively tvoří dílčí transakci, kterou lze vrátit zpět, aniž by to ovlivnilo vnější transakci.
Zpracování chyb:
Ve výchozím nastavení jakákoli chyba vyskytující se ve funkci PL/pgSQL přeruší provádění funkce a samozřejmě také okolní transakce. Chyby můžete zachytit a zotavit se z nich pomocí
BEGIN
blok sEXCEPTION
doložka.
Existují výjimky , včetně, ale nejen:
- data zapsaná do souborů protokolu
-
změny provedené v sekvenci
Důležité :Některé datové typy a funkce PostgreSQL mají speciální pravidla týkající se transakčního chování. Zejména změny provedené v sekvenci (a tedy počítadlo sloupce deklarované pomocí
serial
) jsou okamžitě viditelné pro všechny ostatní transakce a nejsou vráceny zpět, pokud se transakce, která provedla změny, zruší. -
připravené výpisy
- Ukázka SQL Fiddle
-
volání dblink (nebo podobné)
- Podporuje Postgres vnořené nebo autonomní transakce?