Кілька блоків обробки винятків
Оскільки ROLLBACK TO і SAVEPOINT не можна використовувати у функціях з обробниками винятків, ми можемо відтворити таку саму поведінку за допомогою вкладених блоків. Такі вкладені блоки дають змогу згрупувати оператори та впорядкувати їх залежно від послідовності виконання. Тут ви вставите групу записів із обробником винятків, який емулює SAVEPOINT, а потім оновите запис із власним обробником винятків. Під час оновлення виникне помилка, і обробник винятків автоматично відкотить лише цей блок.
Ця вправа є частиною курсу
Транзакції та обробка помилок у PostgreSQL
Інструкції до вправи
- У першому блоці вставте до
patientsтакі записи (a1c=5.6,glucose=93, іfasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)з обробникомEXCEPTION, який вставляє'failed to insert'якmsgдо таблиці errors. - Відкрийте другий вкладений блок і оновіть пацієнта з ID 1, задавши
fastingзначення'true', з обробкою винятків, яка записує до таблиціerrorsповідомленняmsg='Inserted string into boolean.'. - Завершіть обидва блоки за допомогою
END.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
-- 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;