多个异常代码块
由于在带有异常处理器的函数中不能使用 ROLLBACK TO 和 SAVEPOINT,我们可以通过嵌套代码块来模拟相同的行为。嵌套块用于按依赖顺序对语句分组并排序。本练习中,您将先插入一组记录,并配备一个模拟 SAVEPOINT 的异常处理器;然后再更新一条记录并配备异常处理器。该更新语句会出错,异常处理器会自动仅回滚那个内层代码块。
本练习是课程的一部分
PostgreSQL 中的事务与错误处理
练习说明
- 在第一个代码块中,向
patients插入以下记录(a1c=5.6、glucose=93、fasting=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;