ComeçarComece de graça

Múltiplos blocos de exceção

Como ROLLBACK TO e SAVEPOINT não podem ser usados em funções com tratadores de exceção, existe uma forma de emular o mesmo comportamento usando blocos aninhados. Esses blocos são usados para agrupar e ordenar as instruções conforme suas dependências. Aqui, você vai inserir um bloco de registros com um tratador de exceção que emula um SAVEPOINT, depois atualizar um registro com um tratador de exceção. Essa instrução de atualização vai gerar erro, e o tratador de exceção fará automaticamente o rollback apenas daquele bloco.

Este exercício faz parte do curso

Transações e Tratamento de Erros no PostgreSQL

Ver curso

Instruções do exercício

  • No primeiro bloco, insira os seguintes registros em patients (a1c=5.6, glucose=93, e fasting=TRUE), (6.3, 111, TRUE) (4.7, 65, TRUE) com um tratador EXCEPTION que insere 'failed to insert' como msg na tabela errors.
  • Abra um segundo bloco aninhado e atualize o paciente com ID 1 para ter o valor de fasting igual a 'true', com tratamento de exceção que registre na tabela errors uma msg de 'Inserted string into boolean.'.
  • END em ambos os blocos.

Exercício interativo prático

Experimente este exercício completando este código de exemplo.

-- 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 e executar o código