pl/sql預定義異常處理
一、概念
ORACLE預定義的異常情況大約有24個,無需在程式中定義,由ORACLE自動觸發。
二、語法
<strong><span style="color:#6633ff;">EXCEPTION WHEN first_exception THEN <code to handle first exception > WHEN second_exception THEN <code to handle second exception > WHEN OTHERS THEN <code to handle others exception > END;</span></strong>
三、24個預定義異常
錯誤號 |
異常錯誤資訊名稱 |
說明 |
ORA-0001 |
Dup_val_on_index |
違反了唯一性限制 |
ORA-0051 |
Timeout-on-resource |
在等待資源時發生超時 |
ORA-0061 |
Transaction-backed-out |
由於發生死鎖事務被撤消 |
ORA-1001 |
Invalid-CURSOR |
試圖使用一個無效的遊標 |
ORA-1012 |
Not-logged-on |
沒有連線到ORACLE |
ORA-1017 |
Login-denied |
無效的使用者名稱/口令 |
ORA-1403 |
No_data_found |
SELECT INTO沒有找到資料 |
ORA-1422 |
Too_many_rows |
SELECT INTO 返回多行 |
ORA-1476 |
Zero-divide |
試圖被零除 |
ORA-1722 |
Invalid-NUMBER |
轉換一個數字失敗 |
ORA-6500 |
Storage-error |
記憶體不夠引發的內部錯誤 |
ORA-6501 |
Program-error |
內部錯誤 |
ORA-6502 |
Value-error |
轉換或截斷錯誤 |
ORA-6504 |
Rowtype-mismatch |
宿主遊標變數與 PL/SQL變數有不相容行型別 |
ORA-6511 |
CURSOR-already-OPEN |
試圖開啟一個已處於開啟狀態的遊標 |
ORA-6530 |
Access-INTO-null |
試圖為null 物件的屬性賦值 |
ORA-6531 |
Collection-is-null |
試圖將Exists 以外的集合( collection)方法應用於一個null pl/sql 表上或varray上 |
ORA-6532 |
Subscript-outside-limit |
對巢狀或varray索引得引用超出聲明範圍以外 |
ORA-6533 |
Subscript-beyond-count |
對巢狀或varray 索引得引用大於集合中元素的個數. |
四、例子
CREATE OR REPLACE PROCEDURE P_C_HANDLEEXCEPTION AS
------------------------------------------------------
/*
測試處理異常
created by boat
create time 2015年12月11日
*/
------------------------------------------------------
v_ename scott.emp.ename%TYPE;
BEGIN
SELECT t.ename INTO v_ename FROM scott.emp t WHERE t.empno = '7369';
DBMS_OUTPUT.PUT_LINE('工號為7369的員工姓名為:' || v_ename );
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('不存在工號為7369的員工');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('工號被多個員工公用,請核查');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM);
END P_C_HANDLEEXCEPTION;