開始使用免費開始

多個例外區塊

由於在具有例外處理器的函式中不能使用 ROLLBACK TOSAVEPOINT,我們可以透過巢狀區塊來模擬相同行為。這些巢狀區塊可用來依相依關係分組並排序敘述。這裡你將插入一個帶有例外處理器的紀錄區塊,用來模擬 SAVEPOINT,接著再更新一筆資料,同樣也有例外處理。該次更新會發生錯誤,而例外處理器會自動只回復那個區塊。

本練習屬於課程

PostgreSQL 的交易與錯誤處理

檢視課程

練習說明

  • 在第一個區塊中,將以下紀錄插入 patientsa1c=5.6glucose=93fasting=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;
編輯並執行程式碼