Múltiples bloques de excepción
Como ROLLBACK TO y SAVEPOINT no se pueden usar en funciones con controladores de excepciones, podemos emular ese comportamiento utilizando bloques anidados. Estos bloques anidados agrupan y ordenan las sentencias según sus dependencias. Aquí vas a insertar un bloque de registros con un controlador de excepciones que emula un SAVEPOINT, y luego actualizar un registro con otro controlador de excepciones. Esa sentencia de actualización producirá un error, y el controlador de excepciones hará automáticamente rollback solo de ese bloque.
Este ejercicio forma parte del curso
Transacciones y manejo de errores en PostgreSQL
Instrucciones del ejercicio
- En el primer bloque, inserta los siguientes registros en
patients(a1c=5.6,glucose=93, yfasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)con un manejadorEXCEPTIONque inserte'failed to insert'comomsgen la tablaerrors. - Abre un segundo bloque anidado y actualiza al paciente con ID 1 para que tenga un valor de
fasting'true', con un manejo de excepciones que registre en la tablaerrorsconmsg'Inserted string into boolean.'. ENDambos bloques.
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
-- 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;