ComenzarEmpieza gratis

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

Ver curso

Instrucciones del ejercicio

  • En el primer bloque, inserta los siguientes registros en patients (a1c=5.6, glucose=93, y fasting=TRUE), (6.3, 111, TRUE) (4.7, 65, TRUE) con un manejador EXCEPTION que inserte 'failed to insert' como msg en la tabla errors.
  • 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 tabla errors con msg 'Inserted string into boolean.'.
  • END ambos 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;
Editar y ejecutar código