1. 程式人生 > >Oracle存儲過程的異常處理

Oracle存儲過程的異常處理

begin val 健壯性 字符 問題 嵌套 where 對象類型 exist

1、為了提高存儲過程的健壯性,避免運行錯誤,當建立存儲過程時應包含異常處理部分。

2、異常(EXCEPTION)是一種PL/SQL標識符,包括預定義異常、非預定義異常和自定義異常;

3、預定義異常是指由PL/SQL提供的系統異常;非預定義異常用於處理與預定義異常無關的Oracle錯誤(如完整性約束等);自定義異常用於處理與Oracle錯誤的其他異常情況。

4、RAISE_APPLICATION_ERROR用於自定義錯誤消息,並且消息號必須在-20000~-20999之間

命名的系統異常 產生原因

access_into_null 未定義對象

case_not_found case中若未包含相應的when,並且沒有設置

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 在等待資源時超時

--自定義異常處理

CREATE OR REPLACE PROCEDURE stu_proc

(

--多個用逗號隔開

v_id IN NUMBER

) IS

--多個用分號隔開

v_max_id NUMBER;

v_name VARCHAR2(20);

v_raise EXCEPTION;

BEGIN

SELECT MAX(a.id) INTO v_max_id FROM student a;

IF v_id>v_max_id THEN

RAISE v_raise;

END IF;

SELECT o.sname INTO v_name FROM student o WHERE o.id=v_id;

dbms_output.put_line(‘學生名稱為:‘||v_name);

EXCEPTION

WHEN v_raise THEN

RAISE_APPLICATION_ERROR(-20010, ‘v_id not exists!‘);

WHEN NO_DATA_FOUND THEN

RAISE_APPLICATION_ERROR(-20011, ‘ERROR:不存在!‘);

END stu_proc;

Oracle存儲過程的異常處理