A rigor di termini, Postgres non aveva procedure archiviate come definito nello standard ISO/IEC prima della versione 11. Il termine è spesso usato in modo non corretto per riferirsi a funzioni , che forniscono molte delle stesse funzionalità (e più) fornite da altri RDBMS con le "procedure archiviate". La differenza principale è la gestione delle transazioni.
- Quali sono le differenze tra "Procedure archiviate" e "Funzioni memorizzate"?
Vere procedure archiviate vengono finalmente introdotti con Postgres 11:
- Quando utilizzare la procedura memorizzata/la funzione definita dall'utente?
Funzioni sono atomici in Postgres ed eseguito automaticamente all'interno della propria transazione a meno che non venga chiamato all'interno di una transazione esterna. Esistono sempre all'interno di una singola transazione e riescono o falliscono completamente . Di conseguenza, non è possibile avviare o eseguire transazioni all'interno della funzione. E comandi come VACUUM
, CREATE DATABASE
o CREATE INDEX CONCURRENTLY
che non vengono eseguiti in un contesto di transazione non sono consentiti.
Il manuale su PL/pgSQL:
Le funzioni e le procedure di attivazione vengono sempre eseguite all'interno di una transazione stabilita da una query esterna:non possono avviare o impegnare tale transazione, poiché non ci sarebbe alcun contesto in cui eseguirle. Tuttavia, un blocco contenente un EXCEPTION
La clausola costituisce effettivamente una sottotransazione di cui è possibile eseguire il rollback senza influire sulla transazione esterna.
Gestione degli errori:
Per impostazione predefinita, qualsiasi errore che si verifica in una funzione PL/pgSQL interrompe l'esecuzione della funzione e anche delle transazioni circostanti. Puoi intercettare gli errori e recuperarli utilizzando un BEGIN
bloccare con un EXCEPTION
clausola.
Ci sono eccezioni , incluso ma non limitato a:
- dati scritti nei file di registro
-
modifiche apportate a una sequenza
Importante :Alcuni tipi di dati e funzioni di PostgreSQL hanno regole speciali per quanto riguarda il comportamento transazionale. In particolare, le modifiche apportate alla sequenza (e quindi al contatore di una colonna dichiarata utilizzando
serial
)sono immediatamente visibili a tutte le altre transazioni e non vengono annullate se la transazione che ha apportato le modifiche viene interrotta. -
dichiarazioni preparate
- Demo di SQL Fiddle
-
chiamate dblink (o simili)
- Postgres supporta transazioni annidate o autonome?