無論是預(yù)定義錯(cuò)誤還是自定義錯(cuò)誤,Oracle在內(nèi)部都會(huì)隱含地觸發(fā)一個(gè)錯(cuò)誤,每個(gè)錯(cuò)誤都有一個(gè)序號(hào),SQLCODE就是異常的編碼,SQLERRM用來獲取異常的信息。但是在PL/SQL進(jìn)行異常處理時(shí),不能直接使用異常編碼,必須使用一個(gè)名字來引用和處理異常。因此PL/SQL為一些公共的錯(cuò)誤定義了一系列的預(yù)定義異常。
常見的預(yù)定義異常如下:
Oracle錯(cuò)誤號(hào) |
SQLCODE值 |
異常名稱 |
異常描述 |
ORA-00001 |
-1 |
DUP_CAL_ON_INDEX |
唯一索引對(duì)應(yīng)的列上有重復(fù)值 |
ORA-00051 |
-51 |
TIMEOUT_ON_RESOURCE |
Oracle在等待資源時(shí)超時(shí) |
ORA-01001 |
-1001 |
INVALID_CURSOR |
在不合法的游標(biāo)上進(jìn)行操作 |
ORA-01012 |
-1012 |
NOT_LOGGED_ON |
PL/SQL應(yīng)用程序在沒有連接Oracle數(shù)據(jù)庫的情況下訪問數(shù)據(jù) |
ORA-01017 |
-1017 |
LOGIN_DENIED |
PL/SQL應(yīng)用程序連接Oracle數(shù)據(jù)庫時(shí)提供了不正確的用戶名或密碼 |
ORA-01403 |
100 |
NO_DATA_FOUND |
SELECT INTO語句沒有返回?cái)?shù)據(jù),或者我們的程序引用了一個(gè)嵌套表中被刪除了的元素或索引表中未初始化的元素。SQL聚合函數(shù),如AVG和SUM,總是能返回一個(gè)值或空。所以,一個(gè)調(diào)用聚合函數(shù)的SELECT INTO語句從來不會(huì)拋出NO_DATA_FOUND 異常。FETCH語句最終會(huì)取不到數(shù)據(jù),當(dāng)這種情況發(fā)生時(shí),不會(huì)有異常拋出。 |
ORA-01410 |
-1410 |
SYS_INVALID_ROWID |
從字符串向ROWID轉(zhuǎn)換發(fā)生錯(cuò)誤,因?yàn)樽址⒉淮硪粋€(gè)有效的ROWID |
ORA-01422 |
-1422 |
TOO_MANY_ROWS |
執(zhí)行SELECT INTO時(shí),結(jié)果集超過一行 |
ORA-01476 |
-1476 |
ZERO_DIVIDE |
程序嘗試除以0 |
ORA-01722 |
-1722 |
INVALID_NUMBER |
在一個(gè)SQL語句中,由于字符串并不代表一個(gè)有效的數(shù)字,導(dǎo)致字符串向數(shù)字轉(zhuǎn)換時(shí)會(huì)發(fā)生錯(cuò)誤。當(dāng)FETCH語句的LIMIT子句表達(dá)式后面不是一個(gè)正數(shù)時(shí),這個(gè)異常也會(huì)被拋出。 |
ORA-06500 |
-6500 |
STORAGE_ERROR |
PL/SQL運(yùn)行時(shí)內(nèi)存溢出或內(nèi)存不足 |
ORA-06501 |
-6501 |
PROGRAM_ERROR |
PL/SQL程序發(fā)生內(nèi)部錯(cuò)誤 |
ORA-06502 |
-6502 |
VALUE_ERROR |
賦值時(shí),變量長度不足以容納實(shí)際數(shù)據(jù)。 |
ORA-06504 |
-6504 |
ROWTYPE_MISMATCH |
賦值語句中使用的主游標(biāo)變量和PL/SQL游標(biāo)變量的類型不兼容。 |
ORA-06511 |
-6511 |
CURSOR_ALREADY_OPEN |
程序嘗試打開一個(gè)已經(jīng)打開的游標(biāo)。一個(gè)游標(biāo)在重新打開之前必須關(guān)閉。 |
ORA-06530 |
-6530 |
ACCESS_INTO_NULL |
嘗試向一個(gè)為NULL的對(duì)象的屬性賦值 |
ORA-06531 |
-6531 |
COLLECTION_IS_NULL |
程序嘗試調(diào)用一個(gè)未初始化嵌套表或變長數(shù)組的集合方法(不包括EXISTS),或者是程序嘗試為一個(gè)未初始化嵌套表或變長數(shù)組的元素賦值 |
ORA-06532 |
-6532 |
SUBSCRIPT_OUTSIDE_LIMIT |
程序引用一個(gè)嵌套表或變長數(shù)組,但使用的下標(biāo)索引不在合法的范圍內(nèi)。 |
ORA-06533 |
-6533 |
SUBSCRIPT_BEYOND_COUNT |
程序引用一個(gè)嵌套表或變長數(shù)組元素,但使用的下標(biāo)索引超過嵌套表或變長數(shù)組元素總個(gè)數(shù) |
ORA-06592 |
-6592 |
CASE_NOT_FOUND |
CASE語句中沒有任何WHEN子句滿足條件,并且沒有編寫ELSE子句 |
使用預(yù)定義異常如:
DECLARE
v_empno1 NUMBER(4):=&empno1; --定義員工查詢條件變量
v_empno2 NUMBER(4):=&empno2;
v_empno3 NUMBER(4):=&empno3;
v_sal1 NUMBER(10,2); --定義保存員工薪資的變量
v_sal2 NUMBER(10,2);
v_sal3 NUMBER(10,2);
v_selectcounter NUMBER := 1; --查詢計(jì)數(shù)器變量
BEGIN
SELECT sal INTO v_sal1 FROM emp WHERE empno=v_empno1; --查詢員工薪資信息
v_selectcounter:=2;
SELECT sal INTO v_sal2 FROM emp WHERE empno=v_empno2;
v_selectcounter:=3;
SELECT sal INTO v_sal3 FROM emp WHERE empno=v_empno3;
EXCEPTION
WHEN NO_DATA_FOUND THEN --處理未找到數(shù)據(jù)的異常
DBMS_OUTPUT.PUT_LINE('錯(cuò)誤編號(hào):'||SQLCODE||' 錯(cuò)誤消息:'||SQLERRM
||' 觸發(fā)異常的位置是:'||v_selectcounter);
END;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
|