Несколько блоков обработки исключений
Поскольку 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с сообщением'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;