sql >> Databáze >  >> RDS >> PostgreSQL

Spouštějí se uložené procedury v databázové transakci v Postgresu?

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 s EXCEPTION 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?


  1. SQL – jak transponovat?

  2. Správa dat pomocí Pythonu, SQLite a SQLAlchemy

  3. Postgresql extrahuje poslední řádek pro každé ID

  4. SQLite Zobrazit tabulky