Flera undantagsblock
Eftersom ROLLBACK TO och SAVEPOINT inte kan användas i funktioner med undantagshanterare finns det ett sätt att efterlikna samma beteende med hjälp av nästlade block. Dessa nästlade block används för att gruppera och ordna satser i den ordning de är beroende av varandra. Här ska du infoga ett block med poster som har en undantagshanterare – vilket efterliknar en SAVEPOINT – och sedan uppdatera en post med en undantagshanterare. Uppdateringssatsen kommer att ge ett fel, och undantagshanteraren återställer automatiskt just det blocket.
Den här övningen är en del av kursen
Transaktioner och felhantering i PostgreSQL
Övningsinstruktioner
- I det första blocket infogar du följande poster i
patients(a1c=5.6,glucose=93, ochfasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)med enEXCEPTION-hanterare som infogar'failed to insert'sommsgi errors-tabellen. - Öppna ett andra nästlat block och uppdatera patienten med ID 1 så att
fastingfår värdet'true', med undantagshantering som loggar till tabellenerrorsmedmsg'Inserted string into boolean.'. - Avsluta båda blocken med
END.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
-- Make a DO function
DO $$
-- Open a transaction block
BEGIN
-- Open a nested block
BEGIN
INSERT INTO ___ (___, ___, ___)
VALUES (5.6, 93, TRUE), ___, ___;
-- Catch all exception types
EXCEPTION WHEN others THEN
INSERT INTO ___ (msg) VALUES ('failed to insert');
-- End nested block
END;
-- Begin the second nested block
BEGIN
UPDATE patients SET ___ = '___' WHERE id=1;
-- Catch all exception types
EXCEPTION WHEN others THEN
INSERT INTO errors (msg) VALUES ('Inserted ___ into ___.');
-- End the second nested block
END;
-- END the outer block
END;
$$ language 'plpgsql';
SELECT * FROM errors;