เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

บล็อก 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) พร้อมเพิ่ม EXCEPTION handler ที่แทรกข้อความ '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;
แก้ไขและรันโค้ด