在運行程序時出現的錯誤叫做異常。發生異常後,語句將停止執行,控制權轉移到 PL/SQL 塊的異常處理部分。如果發生與某個異常名稱相匹配的異常時,程序就會執行與其相應的THEN後面的代碼,若沒有相匹配的異常則執行OTHERS對應的TEHN後面的代碼。
異常有兩種類型:
1、系統定義異常 - 當 PL/SQL 程序違反 Oracle 規則或超越系統限制時隱式引發。
2、用戶定義異常 - 用戶可以在 PL/SQL 塊的聲明部分定義異常,自定義的異常通過 RAISE 語句顯式引發。
語法
EXCEPTION
WHEN exception_name1 THEN
statement1;
WHEN exception_name2 THEN
statement2;
......
WHEN OTHERS THEN
other_statements;
系統常用異常
異常 |
說明 |
INVALID_NUMBER |
非法數字 |
NO_DATA_FOUND |
未查找到數據 |
PROGRAM_ERROR |
程序錯誤 |
TOO_MANY_ROWS |
查詢多行錯誤 |
ZERO_DIVIDE |
除數爲0錯誤 |
LOGIN_DENIED |
登陸受限 |
ACCESS_INTO_NULL |
未初始化對象 |
DECLARE
v_empno emp.empno%TYPE;
v_emp emp%ROWTYPE;
BEGIN
v_empno:=&員工編號; --要求輸入員工編號
select * into v_emp from emp where empno=v_empno;
DBMS_OUTPUT.PUT_LINE(‘編號是’||v_empno||‘的員工姓名是'||v_emp.ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('編號是'||v_empno||'的員工不存在!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('錯誤號是'||SQLCODE);
DBMS_OUTPUT.PUT_LINE('錯誤原因是'||SQLERRM);
END;
DECLARE
v_name emp.ename%type;
BEGIN
SELECT ename INTO v_name FROM emp;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('該查詢提取多行');
END;
用戶自定義異常
用戶自定義異常機制應用步驟
1、DECLARE 中聲明異常:自定義異常名 EXCEPTION;
2、根據條件註冊異常,即什麼情況下將產生自定義的異常:RAISE 自定義異常名
3、異常處理:
(1)、EXCEPTION
WHEN 自定義異常名 THEN
RAISE_APPLICATION_ERROR(error_number,error_message);
(2)、 error_number:錯誤號,取值範圍-20000到-20999
(3)、error_message:錯誤信息,最大爲2048個字節
示例:
DECLARE
v_empno emp.empno%TYPE;
v_emp emp%ROWTYPE;
empno_no_found EXCEPTION;--自定義異常
v_count PLS_INTEGER;--帶符號整數
BEGIN
v_empno:=&員工編號;
select count(*) into v_count from emp where empno=v_empno;
IF v_count<1 THEN
RAISE empno_no_found;--註冊異常
END IF;
select * into v_emp from emp where empno=v_empno;
DBMS_OUTPUT.PUT_LINE('編號是'||v_empno||'的員工姓名是'||v_emp.ename);
EXCEPTION
WHEN empno_no_found THEN
RAISE_APPLICATION_ERROR(-20001,'該編號的員工不存在!');
END;