Oracle預存程序—異常

來源:互聯網
上載者:User

Oracle異常分預定義異常和自訂異常(個人覺得)。

預定義異常裡麵包括匿名異常和非匿名異常。

(匿名異常:沒有名稱,像ORA-00371;

非匿名異常:有名稱,像no_data_found)。

自訂異常:需要聲明,與業務相關。

異常的拋出用raise。在exception捕獲後,可以向上繼續raise拋出。

在exception代碼塊捕獲後,如果想把異常反應給應用程式,使用

raise_application_error(-20000, '自訂異常:Null 字元串!', false);

或raise_application_error(-20000, '自訂異常:Null 字元串!');

第一個參數是錯誤號碼,從 -20000到 -20999.

第二個參數是錯誤資訊。

第三個參數,boolean類型,預設false,可以不寫這個參數。

true(添加進錯誤堆棧),false(覆蓋錯誤堆棧)。

在plsql中執行的效果就是彈出錯誤提示框。

create or replace procedure pro_ten(p_one in varchar2, p_two out varchar2) is  exception_customized_one exception; --自訂異常1  exception_customized_two exception; --自訂異常2  exception_customized_three exception; --自訂異常3,與oracle內部匿名異常的綁定  pragma exception_init(exception_customized_three,-371);--  例如:ORA-00371: 共用池記憶體不足 begin  dbms_output.put_line('傳參:' || 'p_one:' || p_one || 'p_one長度:' ||                       length(p_one) || 'trim後長度:' || length(trim(p_one)));  if (p_one is null or trim(p_one) is null) then    -- 注意這裡不能寫成trim(p_one)='',根據實驗結果就是這樣的    raise exception_customized_one;  elsif (trim(p_one)='0' or trim(p_one)='0.0') then       raise exception_customized_two;  elsif (trim(p_one)='1') then       raise exception_customized_three;  else    begin      p_two := p_one || '  has changed';      dbms_output.put_line('返回結果:' || 'p_two:' || p_two);    end;  end if;exception  when exception_customized_one then    begin      dbms_output.put_line('exception -20000 occured, 自訂異常:Null 字元串!');      raise_application_error(-20000, '自訂異常:Null 字元串!', false);    end;  when exception_customized_two then      dbms_output.put_line('exception -20001 occured, 自訂異常:數字0出現!');      raise;--這裡把異常向上繼續拋出,交給調用者處理                  /*與內部異常綁定的自訂異常就不用捕獲了,因為內部有異常Oracle檢測並自動拋出的。      我們綁定的目的就是把不在人家定義的範圍的情況加進去,讓oracle認識我們定義的情況。      這樣異常就直接到others代碼塊了*/  /*when exception_customized_three then      dbms_output.put_line(SQLERRM);      raise exception_customized_three;*/  when others then    dbms_output.put_line('others exception!');    dbms_output.put_line(SQLERRM);--錯誤資訊    raise;--這裡把異常向上繼續拋出,交給調用者處理end pro_ten;

測試上面3種異常:

Oracle預定義的21個非匿名異常列表: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      除數為 0subscript_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在等待資源時超

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.