НачатьНачать бесплатно

Несколько блоков обработки исключений

Поскольку 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;
Редактировать и запускать код