Aan de slagGa gratis aan de slag

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

Cursus bekijken

Oefeninstructies

  • Voeg in het eerste blok de volgende records toe aan patients (a1c=5.6, glucose=93, en fasting=TRUE), (6.3, 111, TRUE) (4.7, 65, TRUE) met een EXCEPTION-handler die 'failed to insert' als msg in errors invoegt.
  • Open een tweede, genest blok en update de patiënt met ID 1 zodat fasting de waarde 'true' krijgt, met exception handling die naar de tabel errors schrijft met msg '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;
Code bewerken en uitvoeren