Meerdere exception-blokken
Omdat ROLLBACK TO en SAVEPOINT niet kunnen worden gebruikt in functies met exception handlers, kunnen we hetzelfde gedrag nabootsen met geneste blokken. Deze geneste blokken worden gebruikt om statements te groeperen en te ordenen in de volgorde waarin ze van elkaar afhankelijk zijn. Je gaat hier een blok met records invoegen met een exception handler die een SAVEPOINT emuleert, en daarna een record updaten met een exception handler. Die UPDATE-statement zal een fout geven, en de exception handler rolt automatisch alleen dat blok terug.
Deze oefening maakt deel uit van de cursus
Transacties en foutafhandeling in PostgreSQL
Oefeninstructies
- Voeg in het eerste blok de volgende records toe aan
patients(a1c=5.6,glucose=93, enfasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)met eenEXCEPTION-handler die'failed to insert'alsmsginerrorsinvoegt. - Open een tweede, genest blok en update de patiënt met ID 1 zodat
fastingde waarde'true'krijgt, met exception handling die naar de tabelerrorsschrijft metmsg'Inserted string into boolean.'. - Sluit beide blokken af met
END.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
-- 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;