บล็อก exception หลายชั้น
เนื่องจาก ROLLBACK TO และ SAVEPOINT ไม่สามารถใช้ภายในฟังก์ชันที่มี exception handler ได้ เราจึงจำลองพฤติกรรมเดียวกันด้วยการใช้บล็อกซ้อนกัน (nested blocks) บล็อกเหล่านี้ช่วยจัดกลุ่มและเรียงลำดับคำสั่งตามความสัมพันธ์ที่ขึ้นต่อกัน ในแบบฝึกหัดนี้ คุณจะแทรกชุดระเบียนพร้อม exception handler ที่ทำหน้าที่เลียนแบบ SAVEPOINT จากนั้นอัปเดตระเบียนพร้อม exception handler อีกตัว โดยคำสั่ง UPDATE จะเกิดข้อผิดพลาด และ exception handler จะ rollback เฉพาะบล็อกนั้นโดยอัตโนมัติ
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
Transactions and Error Handling in PostgreSQL
คำแนะนำการฝึกหัด
- ในบล็อกแรก ให้แทรกระเบียนต่อไปนี้ลงในตาราง
patientsได้แก่ (a1c=5.6,glucose=93,fasting=TRUE),(6.3, 111, TRUE)และ(4.7, 65, TRUE)พร้อมเพิ่มEXCEPTIONhandler ที่แทรกข้อความ'failed to insert'เป็นค่าmsgลงในตาราง errors - เปิดบล็อกซ้อนที่สอง แล้วอัปเดตข้อมูลผู้ป่วยที่มี ID เป็น 1 ให้มีค่า
fastingเป็น'true'พร้อม exception handler ที่บันทึกข้อมูลลงตารางerrorsโดยใช้msgว่า'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;