Nhiều khối xử lý ngoại lệ
Vì ROLLBACK TO và SAVEPOINT không thể dùng trong hàm có bộ xử lý ngoại lệ, ta có cách mô phỏng hành vi tương tự bằng các khối lồng nhau. Các khối lồng nhau này dùng để nhóm và sắp xếp các câu lệnh theo thứ tự phụ thuộc lẫn nhau. Tại đây bạn sẽ chèn một khối bản ghi với bộ xử lý ngoại lệ mô phỏng SAVEPOINT, sau đó cập nhật một bản ghi với bộ xử lý ngoại lệ. Câu lệnh cập nhật đó sẽ báo lỗi, và bộ xử lý ngoại lệ sẽ tự động rollback chỉ riêng khối đó.
Bài tập này là một phần của khóa học
Giao dịch và Xử lý Lỗi trong PostgreSQL
Hướng dẫn bài tập
- Trong khối đầu tiên, chèn các bản ghi sau vào
patients(a1c=5.6,glucose=93, vàfasting=TRUE),(6.3, 111, TRUE)(4.7, 65, TRUE)với một bộ xử lýEXCEPTIONchèn'failed to insert'làmmsgvào bảng errors. - Mở một khối lồng nhau thứ hai và cập nhật bệnh nhân có ID bằng 1 để có giá trị
fastinglà'true', kèm xử lý ngoại lệ ghi vào bảngerrorsvớimsglà'Inserted string into boolean.'. ENDcả hai khối.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
-- 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;