默認(rèn)情況下,SPL 程序中發(fā)生的任何錯(cuò)誤都會(huì)中止該程序的執(zhí)行。通過使用帶有 EXCEPTION 部分的 BEGIN 塊,您可以捕獲錯(cuò)誤并從中恢復(fù)。
其語(yǔ)法是 BEGIN 塊的常規(guī)語(yǔ)法的擴(kuò)展:
[ DECLARE
declarations ]
BEGIN
statements
EXCEPTION
WHEN condition [ OR condition ]... THEN
handler_statements
[ WHEN condition [ OR condition ]... THEN
handler_statements ]...
END;
如果未發(fā)生錯(cuò)誤,這種形式的塊只執(zhí)行所有 statements,然后控制權(quán)將在 END 之后傳遞給下一個(gè)語(yǔ)句。如果在 statements 中發(fā)生錯(cuò)誤,則放棄對(duì) statements 的進(jìn)一步處理,并且控制權(quán)將傳遞給 EXCEPTION 列表。將在該列表中搜索與發(fā)生錯(cuò)誤匹配的第一個(gè) condition。如果找到匹配項(xiàng),則將執(zhí)行相應(yīng)的 handler_statements,然后控制權(quán)將在 END 之后傳遞給下一個(gè)語(yǔ)句。如果未找到匹配項(xiàng),則錯(cuò)誤會(huì)傳播出去,就好像 EXCEPTION 子句根本不存在一樣。帶 EXCEPTION 的封閉塊可能會(huì)捕獲錯(cuò)誤;如果沒有封閉塊,則會(huì)終止子程序的處理。
特殊的條件名稱 OTHERS 與每種錯(cuò)誤類型都匹配。條件名稱不區(qū)分大小寫。
如果在所選的 handler_statements 中發(fā)生新錯(cuò)誤,則它不能被此 EXCEPTION 子句捕獲,而是被傳播出去。周圍的 EXCEPTION 子句可捕獲它。
下表列出了可能使用的條件名稱:
條件名稱 | 說(shuō)明 |
---|---|
CASE_NOT_FOUND | 應(yīng)用程序遇到這樣一種情況:CASE語(yǔ)句中任何 case 的求值結(jié)果都不為TRUE,并且沒有ELSE條件。 |
COLLECTION_IS_NULL | 應(yīng)用程序嘗試對(duì)空集合(如未初始化的嵌套表)調(diào)用集合方法。 |
CURSOR_ALREADY_OPEN | 應(yīng)用程序嘗試打開已打開的游標(biāo)。 |
DUP_VAL_ON_INDEX | 應(yīng)用程序嘗試存儲(chǔ)受約束列中當(dāng)前存在的重復(fù)值。 |
INVALID_CURSOR | 應(yīng)用程序嘗試訪問未打開的游標(biāo)。 |
INVALID_NUMBER | 應(yīng)用程序遇到數(shù)據(jù)異常(相當(dāng)于 SQLSTATE 類代碼 22)。INVALID_NUMBER是VALUE_ERROR的別名。 |
NO_DATA_FOUND | 沒有符合選擇標(biāo)準(zhǔn)的行。 |
OTHERS | 應(yīng)用程序遇到一個(gè)異常,該異常未被異常部分中的前提條件捕獲。 |
SUBSCRIPT_BEYOND_COUNT | 應(yīng)用程序嘗試引用的嵌套表下標(biāo)或動(dòng)態(tài)數(shù)組超出其初始化或擴(kuò)展大小。 |
SUBSCRIPT_OUTSIDE_LIMIT | 應(yīng)用程序嘗試引用下標(biāo)或嘗試將動(dòng)態(tài)數(shù)組擴(kuò)展到超出其最大大小限制。 |
TOO_MANY_ROWS | 應(yīng)用程序遇到滿足選擇標(biāo)準(zhǔn)的多行(該標(biāo)準(zhǔn)中只允許返回一行)。 |
VALUE_ERROR | 應(yīng)用程序遇到數(shù)據(jù)異常(相當(dāng)于 SQLSTATE 類代碼 22)。VALUE_ERROR是INVALID_NUMBER的別名。 |
ZERO_DIVIDE | 應(yīng)用程序嘗試除以零。 |
User-defined Exception | 請(qǐng)參見用戶定義的異常。 |