多個例外區塊
由於在具有例外處理器的函式中不能使用 ROLLBACK TO 和 SAVEPOINT,我們可以透過巢狀區塊來模擬相同行為。這些巢狀區塊可用來依相依關係分組並排序敘述。這裡你將插入一個帶有例外處理器的紀錄區塊,用來模擬 SAVEPOINT,接著再更新一筆資料,同樣也有例外處理。該次更新會發生錯誤,而例外處理器會自動只回復那個區塊。
本練習屬於課程
PostgreSQL 的交易與錯誤處理
練習說明
- 在第一個區塊中,將以下紀錄插入
patients(a1c=5.6、glucose=93、fasting=TRUE)、(6.3, 111, TRUE)、(4.7, 65, TRUE),並加入一個EXCEPTION處理器,當失敗時將'failed to insert'作為msg插入 errors。 - 開啟第二個巢狀區塊,將 ID 為 1 的病患其
fasting值更新為'true',並加入例外處理,當發生例外時在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;