命名的系統異常 |
產生原因 |
ACCESS_INTO_NULL |
未定義對象 |
CASE_NOT_FOUND |
CASE 中若未包含相應的 WHEN ,並且沒有設置 ELSE 時 |
COLLECTION_IS_NULL |
集合元素未初始化 |
CURSER_ALREADY_OPEN |
游標已經打開 |
DUP_VAL_ON_INDEX |
唯一索引對應的列上有重復的值 |
INVALID_CURSOR |
在不合法的游標上進行操作 |
INVALID_NUMBER |
內嵌的 SQL 語句不能將字符轉換為數字 |
NO_DATA_FOUND |
使用 select into 未返回行,或應用索引表未初始化的元素時 |
TOO_MANY_ROWS |
執行 select into 時,結果集超過一行 |
ZERO_DIVIDE |
除數為 0 |
SUBSCRIPT_BEYOND_COUNT |
元素下標超過嵌套表或 VARRAY 的最大值 |
SUBSCRIPT_OUTSIDE_LIMIT |
使用嵌套表或 VARRAY 時,將下標指定為負數 |
VALUE_ERROR |
賦值時,變量長度不足以容納實際數據 |
LOGIN_DENIED |
PL/SQL 應用程序連接到 oracle 數據庫時,提供了不正確的用戶名或密碼 |
NOT_LOGGED_ON |
PL/SQL 應用程序在沒有連接 oralce 數據庫的情況下訪問數據 |
PROGRAM_ERROR |
PL/SQL 內部問題,可能需要重裝數據字典& pl./SQL 系統包 |
ROWTYPE_MISMATCH |
宿主游標變量與 PL/SQL 游標變量的返回類型不兼容 |
SELF_IS_NULL |
使用對象類型時,在 null 對象上調用對象方法 |
STORAGE_ERROR |
運行 PL/SQL 時,超出內存空間 |
SYS_INVALID_ID |
無效的 ROWID 字符串 |
TIMEOUT_ON_RESOURCE |
Oracle 在等待資源時超時 |
下面的異常帶有錯誤代碼:
Oracle在預定義包STANDARD包中提供了一系列的預定義異常。他們是調試Oracle PL/SQL程序的有用工具。大部分錯誤用負號作為錯誤號。可以使用SQLCODE內置函數看到錯誤代碼,使用SQLERRM得到異常的內置消息。
異常
|
錯誤
|
何時出現
|
ACCESS_INTO_NULL | ORA-06530 | 試圖訪問未初始化對象的時候出現 |
CASE_NOT_FOUND | ORA-06592 | 如果定義了一個沒有ELSE子句的CASE語句,而且沒有CASE語句滿足運行時條件時出現該異常 |
COLLECTION_IS_NULL | ORA-06531 | 當程序去訪問一個沒有進行初始化的NESTED TABLE或者是VARRAY的時候,會出現該異常 |
CURSOR_ALREADY_OPEN | ORA-06511 | 游標已經被OPEN,如果再次嘗試打開該游標的時候,會出現該異常 |
DUP_VAL_ON_INDEX | ORA-00001 | 如果插入一列被唯一索引約束的重復值的時候,就會引發該異常(該值被INDEX認定為沖突的) |
INVALID_CURSOR | ORA-01001 | 不允許的游標操作,比如關閉一個已經被關閉的游標,就會引發 |
INVALID_NUMBER | ORA-01722 | 給數字值賦非數字值的時候,該異常就會發生,這個異常也會發生在批讀取時候LIMIT子句返回非正數的時候 |
LOGIN_DENIED | ORA-01017 | 程序中,使用錯誤的用戶名和密碼登錄的時候,就會拋出這個異常 |
NO_DATA_FOUND | ORA_06548 | 在使用SELECT INTO 結構,並且語句返回NULL值的時候;訪問嵌套表中已經刪除的表或者是訪問INDEX BY表(聯合數組)中的未初始化元素就會出現該異常 |
NOT_LOGGED_ON | ORA-01012 | 當程序發出數據庫調用,但是沒有連接的時候(通常,在實際與會話斷開連接之后) |
PROGRAM_ERROR | ORA-06501 | 當Oracle還未正式捕獲的錯誤發生時常會發生,這是因為數據庫大量的Object功能而發生 |
ROWTYPE_MISMATCH | ORA-06504 | 如果游標結構不適合PL/SQL游標變量或者是實際的游標參數不同於游標形參的時候發生該異常 |
SELF_IS_NULL | ORA-30625 | 調用一個對象類型非靜態成員方法(其中沒有初始化對象類型實例)的時候發生該異常 |
STORAGE_ERROR | ORA-06500 | 當內存不夠分配SGA的足夠配額或者是被破壞的時候,引發該異常 |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | 當分配給NESTED TABLE或者VARRAY的空間小於使用的下標的時候,發生該異常(類似於java的ArrayIndexOutOfBoundsException) |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | 使用非法的索引值來訪問NESTED TABLE或者VARRAY的時候引發 |
SYS_INVALID_ROWID | ORA-01410 | 將無效的字符串轉化為ROWID的時候引發 |
TIMEOUT_ON_RESOURCE | ORA-00051 | 當數據庫不能安全鎖定資源的時候引發 |
TOO_MANY_ROWS | ORA-01422 | 常見錯誤,在使用SELECT INTO 並且查詢返回多個行時引發。如果子查詢返回多行,而比較運算符為相等的時候也會引發該異常。 |
USERENV_COMMITSCN_ERROR | ORA-01725 | 只可使用函數USERENV('COMMITSCN')作為INSERT語句的VALUES子句中的頂級表達式或者作為UPDATE語句的SET子句中的右操作數 |
VALUE_ERROR | ORA-06502 | 將一個變量賦給另一個不能容納該變量的變量時引發 |
ZERO_DIVIDE | ORA-01476 | 將某個數字除以0的時候,會發生該異常 |
可以很方便的在SQL塊中使用EXCEPTION來捕捉異常並且進行處理(當然,編譯異常與在聲明塊中被拋出的異常除外,一個好的PL/SQL編程習慣是規避在聲明塊中進行變量的賦值操作)。如果上面的預定義異常能夠滿足要求,就可以使用他們。如果不滿足,則可以像JAVA程序一樣,定義自己的異常,並且可以使用RAISE EXCEPTION來拋出異常。
參考: