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
Instruções do exercício
- No primeiro bloco, insira os seguintes registros em
patients(a1c=5.6,glucose=93, efasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)com um tratadorEXCEPTIONque insere'failed to insert'comomsgna tabelaerrors. - Abra um segundo bloco aninhado e atualize o paciente com ID 1 para ter o valor de
fastingigual a'true', com tratamento de exceção que registre na tabelaerrorsumamsgde'Inserted string into boolean.'. - Dê
ENDem 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;