En plpgsql funktion kører automatisk i en transaktion. Det hele lykkes eller det hele mislykkes. Manualen:
Funktioner og triggerprocedurer udføres altid inden for en transaktion 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 deltransaktion, der kan rulles tilbage uden at påvirke den ydre transaktion. For mere om det, se afsnit 42.6.6.
Så hvis du har brug for det, kan du fange en undtagelse, som teoretisk set kan forekomme (men er meget usandsynlig).
Detaljer om indfangningsfejl i manualen.
Din funktion gennemgået og forenklet:
CREATE FUNCTION foo(v_weather text
, v_timeofday text
, v_speed text
, v_behavior text)
RETURNS SETOF custombehavior
LANGUAGE plpgsql AS
$func$
BEGIN
DELETE FROM custombehavior
WHERE weather = 'RAIN'
AND timeofday = 'NIGHT'
AND speed = '45MPH';
INSERT INTO custombehavior (weather, timeofday, speed, behavior)
SELECT v_weather, v_timeofday, v_speed, v_behavior
WHERE NOT EXISTS (
SELECT FROM defaultbehavior
WHERE a = 'RAIN'
AND b = 'NIGHT'
AND c = '45MPH'
);
RETURN QUERY
SELECT * FROM custombehavior WHERE ... ;
END
$func$;
Hvis du rent faktisk har brug for at begynde/afslutte transaktioner som angivet i titlen se til SQL procedurer i Postgres 11 eller senere (CREATE PROCEDURE
). Se:
- Hvad er forskellen mellem en "lagret procedure" og andre typer funktioner i PostgreSQL?