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 y completa el código de muestra.
-- 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;