Det havde Postgres strengt taget ikke have lagrede procedurer som defineret i ISO/IEC-standarden før version 11. Begrebet bruges ofte forkert til at henvise til funktioner , som giver meget af den samme funktionalitet (og mere) som andre RDBMS giver med "lagrede procedurer". Den største forskel er transaktionshåndtering.
- Hvad er forskellene mellem "lagrede procedurer" og "lagrede funktioner"?
Ægte lagrede procedurer er endelig introduceret med Postgres 11:
- Hvornår skal den lagrede procedure/brugerdefinerede funktion bruges?
Funktioner er atomare i Postgres og kører automatisk i deres egen transaktion, medmindre de kaldes inden for en ydre transaktion. De kører altid i en enkelt transaktion og lykkes eller fejler helt . Derfor kan man ikke påbegynde eller udføre transaktioner i funktionen. Og kommandoer som VACUUM
, CREATE DATABASE
, eller CREATE INDEX CONCURRENTLY
som ikke kører i en transaktionskontekst er ikke tilladt.
Manualen om PL/pgSQL:
Funktioner og triggerprocedurer udføres altid inden for en transaktion, der er etableret af en ydre forespørgsel — de kan ikke starte eller udføre den transaktion, da der ikke ville være nogen kontekst for dem at udføre i. En blok, der indeholder en EXCEPTION
klausul danner effektivt en undertransaktion, der kan rulles tilbage uden at påvirke den ydre transaktion.
Fejlhåndtering:
Som standard afbryder enhver fejl, der opstår i en PL/pgSQL-funktion, udførelsen af funktionen og faktisk også den omgivende transaktion. Du kan fange fejl og gendanne dem ved at bruge en BEGIN
blok med en EXCEPTION
klausul.
Der er undtagelser , herunder men ikke begrænset til:
- data skrevet til logfiler
-
ændringer foretaget i en sekvens
Vigtigt :Nogle PostgreSQL-datatyper og -funktioner har særlige regler vedrørende transaktionsadfærd. Især ændringer i rækkefølgen (og derfor tælleren for en kolonne, der er erklæret ved hjælp af
serial
)er umiddelbart synlige for alle andre transaktioner og rulles ikke tilbage, hvis transaktionen, der foretog ændringerne, afbrydes. -
udarbejdede erklæringer
- SQL Fiddle-demo
-
dblink-opkald (eller lignende)
- Understøtter Postgres indlejrede eller autonome transaktioner?