sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL kan ikke begynde/afslutte transaktioner i PL/pgSQL

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?


  1. Sådan udtrækkes ugenummeret fra en dato i PostgreSQL

  2. Sådan starter du PostgreSQL Server på Mac OS X via Homebrew

  3. En præ-udfyldt database virker ikke ved API 28, og der er ingen sådan tabelundtagelse

  4. Hvordan forhindrer man BOB i at fortolke et spørgsmålstegn som en pladsholder?