Oracle異常的處理

什麼是異常?   

學習異常之前,必須瞭解什麼是異常,關於異常的衆家說法,我們只用記住:異常用於處理業務邏輯,控制跳轉!

 

異常有兩個屬性:

  • 異常編號  SQLCODE(-1 之 -100000)
  • 異常描述 SQLERRM

關於異常的幾種定義:

   以

      定義a,b變量,輸出其商做範例(分母爲0時的EXCEPTION):

    獲取異常對象信息(SQLCODE和SQLERRM)
  • DECLARE
    a NUMBER;
    b NUMBER;
    c NUMBER;
    BEGIN
    a:=&輸入a;
    b:=&輸入b:;
    c:=a/b;
    dbms_output.put_line(c);
    EXCEPTION
    WHEN OTHERS THEN
    dbms_output.put_line(Sqlcode||','||sqlerrm);
    END;

 

  • 根據異常信息信息,捕捉該對象
    DECLARE
    a NUMBER;
    b NUMBER;
    c NUMBER;
    my_e EXCEPTION;
    PRAGMA EXCEPTION_INIT(my_e,-1476);
    BEGIN
    a:=&輸入a;
    b:=&輸入b;
    c:=a/b;
    dbms_output.put_line(c);
    EXCEPTION
    WHEN my_e THEN
    dbms_output.put_line('錯誤');
    WHEN OTHERS THEN
    dbms_output.put_line(Sqlcode||'=>'||Sqlerrm);
    END;

 

  • 使用Oracle預定義異常信息
    DECLARE
    a NUMBER;
    b NUMBER;
    c NUMBER;
    BEGIN
    a:=&輸入a;
    b:=&輸入b:;
    c:=a/b;
    dbms_output.put_line(c);
    EXCEPTION
    WHEN Zero_divide THEN
    dbms_output.put_line('000000000000');
    WHEN OTHERS THEN
    dbms_output.put_line(Sqlcode||','||sqlerrm);
    END;

 

  • 使用raise_application_error拋出自定義異常信息
    DECLARE
    a NUMBER;
    b NUMBER;
    BEGIN
    a:=&輸入a;
    b:=&輸入b:;
    IF(a>b)THEN
    raise_application_error(-20013,'b的值太小!');
    ELSE
    dbms_output.put_line(Sqlcode||','||sqlerrm);
    END IF;
    END;

常見異常編號:

Access_info_null(ora-06530):當訪問沒有初始化的對象時觸發。
Case_not_found(ora-06592):在case過程中when後沒有包含必要的條件分支並且沒有else子句,則會觸發本異常。
Collection_is_null(06531):訪問未初始化的集合元素(嵌套表或者varray)。
Cursor_already_open(ora-06511):重新打開已經打開的遊標。
Dup_val_on_index(ora-00001):當中唯一索引所對應的列上鍵入重複值時。
Invalid_cursor(ora-01001):試圖在不合法的遊標上執行操作時,譬如沒打開遊標就提取內容
Invalid_number(ora-01722):當試圖將非法的字符串轉換爲數字類型時。
No_data_found(ora-01403):執行select into未返回行,或者引用了索引表未初始化的元素時。
Too_many_rows(ora-01422):執行select into返回超過一行數據時。
Zero_divide(ora-01476):0作爲被除數時。
Subscript_beyond_count(ora-06533):使用嵌套表或者varray集合時,如果引用下標超過last。
Subscript_outside_limit(ora-06532):使用嵌套表或varray集合時,如果引用下標小於first。
Value_error(ora-06502):在執行賦值操作時,如果變量長度不足以容納實際數據。
Login_denied(ora-01017):連接數據庫時提供了不正確的用戶名或口令。
Not_logged_on(ora-01012):在程序沒有連接到oracle數據庫時執行plsql代碼則會觸發。
Program_error(ora-06501):plsql內部問題。
Rowtype_mismatch(ora-06504):執行賦值操作時,如果宿主遊標變量和PLSQL遊標變量返回類型不兼容時。
Self_is_null(ora-30625):使用對象類型時,如果在null實例上調用成員方法。
Storage_error(ora-06500):超出內存空間或者內存被損壞。
Sys_invalid_rowid(ora-01410):無效字符串企圖轉換爲rowid類型時。
Timeout_on_resource(ora-00051):等待資源時出現超時錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章