开始使用免费开始使用

多个异常代码块

由于在带有异常处理器的函数中不能使用 ROLLBACK TOSAVEPOINT,我们可以通过嵌套代码块来模拟相同的行为。嵌套块用于按依赖顺序对语句分组并排序。本练习中,您将先插入一组记录,并配备一个模拟 SAVEPOINT 的异常处理器;然后再更新一条记录并配备异常处理器。该更新语句会出错,异常处理器会自动仅回滚那个内层代码块。

本练习是课程的一部分

PostgreSQL 中的事务与错误处理

查看课程

练习说明

  • 在第一个代码块中,向 patients 插入以下记录(a1c=5.6glucose=93fasting=TRUE)、(6.3, 111, TRUE)(4.7, 65, TRUE),并添加一个 EXCEPTION 处理器,在出错时向 errors 表插入 msg'failed to insert' 的记录。
  • 打开第二个嵌套代码块,将 ID 为 1 的患者的 fasting 值更新为 'true',并添加异常处理,将一条 msg'Inserted string into boolean.' 的记录写入 errors 表。
  • 对两个代码块都使用 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;
编辑并运行代码