預設情況下,SPL 程式中發生的任何錯誤都會中止該程式的執行。通過使用帶有 EXCEPTION 部分的 BEGIN 塊,您可以捕獲錯誤並從中恢複。
其文法是 BEGIN 塊的常規文法的擴充:
[ DECLARE
declarations ]
BEGIN
statements
EXCEPTION
WHEN condition [ OR condition ]... THEN
handler_statements
[ WHEN condition [ OR condition ]... THEN
handler_statements ]...
END;如果未發生錯誤,這種形式的塊只執行所有 statements,然後控制權將在 END 之後傳遞給下一個語句。如果在 statements 中發生錯誤,則放棄對 statements 的進一步處理,並且控制權將傳遞給 EXCEPTION 列表。將在該列表中搜尋與發生錯誤匹配的第一個 condition。如果找到匹配項,則將執行相應的 handler_statements,然後控制權將在 END 之後傳遞給下一個語句。如果未找到匹配項,則錯誤會傳播出去,就好像 EXCEPTION 子句根本不存在一樣。帶 EXCEPTION 的封閉塊可能會捕獲錯誤;如果沒有封閉塊,則會終止子程式的處理。
特殊的條件名稱 OTHERS 與每種錯誤類型都匹配。條件名稱不區分大小寫。
如果在所選的 handler_statements 中發生新錯誤,則它不能被此 EXCEPTION 子句捕獲,而是被傳播出去。周圍的 EXCEPTION 子句可捕獲它。
下表列出了可能使用的條件名稱:
| 條件名稱 | 說明 |
| CASE_NOT_FOUND | 應用程式遇到這樣一種情況:CASE語句中任何 case 的求值結果都不為TRUE,並且沒有ELSE條件。 |
| COLLECTION_IS_NULL | 應用程式嘗試對空集合(如未初始化的巢狀表格)調用集合方法。 |
| CURSOR_ALREADY_OPEN | 應用程式嘗試開啟已開啟的遊標。 |
| DUP_VAL_ON_INDEX | 應用程式嘗試儲存受約束列中當前存在的重複值。 |
| INVALID_CURSOR | 應用程式嘗試訪問未開啟的遊標。 |
| INVALID_NUMBER | 應用程式遇到資料異常(相當於 SQLSTATE 類代碼 22)。INVALID_NUMBER是VALUE_ERROR的別名。 |
| NO_DATA_FOUND | 沒有符合選擇標準的行。 |
| OTHERS | 應用程式遇到一個異常,該異常未被異常部分中的前提條件捕獲。 |
| SUBSCRIPT_BEYOND_COUNT | 應用程式嘗試引用的巢狀表格下標或動態數組超出其初始化或擴充大小。 |
| SUBSCRIPT_OUTSIDE_LIMIT | 應用程式嘗試引用下標或嘗試將動態數組擴充到超出其最大大小限制。 |
| TOO_MANY_ROWS | 應用程式遇到滿足選擇標準的多行(該標準中只允許返回一行)。 |
| VALUE_ERROR | 應用程式遇到資料異常(相當於 SQLSTATE 類代碼 22)。VALUE_ERROR是INVALID_NUMBER的別名。 |
| ZERO_DIVIDE | 應用程式嘗試除以零。 |
| User-defined Exception | 請參見使用者定義的異常。 |
說明 條件名稱 INVALID_NUMBER 和 VALUE_ERROR 與 Oracle 資料庫不相容,對於 Oracle 資料庫來說,這些條件名稱僅用於因字串轉換為數字文本失敗而導致的異常。此外,對於 Oracle 資料庫,INVALID_NUMBER 異常只適用於 SQL 陳述式,而VALUE_ERROR 異常只適用於預存程序語句。