Postgres har strängt taget inte ha lagrade procedurer enligt definitionen i ISO/IEC-standarden före version 11. Termen används ofta felaktigt för att referera till funktioner , som ger mycket av samma funktionalitet (och mer) som andra RDBMS tillhandahåller med "lagrade procedurer". Den största skillnaden är transaktionshantering.
- Vilka är skillnaderna mellan "Lagrade procedurer" och "Lagrade funktioner"?
Sanna lagrade procedurer äntligen introduceras med Postgres 11:
- När ska man använda lagrad procedur/användardefinierad funktion?
Funktioner är atomära i Postgres och körs automatiskt i sin egen transaktion om de inte anropas inom en yttre transaktion. De körs alltid i en enda transaktion och lyckas eller misslyckas helt . Följaktligen kan man inte påbörja eller utföra transaktioner inom funktionen. Och kommandon som VACUUM
, CREATE DATABASE
, eller CREATE INDEX CONCURRENTLY
som inte körs i transaktionssammanhang är inte tillåtna.
Manualen om PL/pgSQL:
Funktioner och triggerprocedurer exekveras alltid inom en transaktion som upprättats av en yttre fråga - de kan inte starta eller utföra den transaktionen, eftersom det inte skulle finnas något sammanhang för dem att exekvera i. Ett block som innehåller en
EXCEPTION
klausul bildar i praktiken en deltransaktion som kan återställas utan att påverka den yttre transaktionen.
Felhantering:
Som standard avbryter alla fel som uppstår i en PL/pgSQL-funktion exekveringen av funktionen, och faktiskt också den omgivande transaktionen. Du kan fånga fel och återställa från dem genom att använda en
BEGIN
block med enEXCEPTION
klausul.
Det finns undantag , inklusive men inte begränsat till:
- data skrivna till loggfiler
-
ändringar som gjorts i en sekvens
Viktigt :Vissa PostgreSQL-datatyper och funktioner har särskilda regler för transaktionsbeteende. I synnerhet ändringar som gjorts i sekvensen (och därför räknaren för en kolumn som deklareras med
serial
) är omedelbart synliga för alla andra transaktioner och återställs inte om transaktionen som gjorde ändringarna avbryts. -
förberedda uttalanden
- SQL Fiddle-demo
-
dblink-samtal (eller liknande)
- Stöder Postgres kapslade eller autonoma transaktioner?