Oracle 學習筆記12 異常處理

2021-06-14 13:59:07 字數 4725 閱讀 2641

oracle使用異常來處理,pl/sql執行時發生的錯誤,這些異常都可以包括在pl/sql程式的exception塊中。oracle提供了許多的內建的異常,使用者也可以根據自己的需要定義異常。oracle的異常可以分為3類:

1>預定義異常oracle中內建了大量異常。在pl/sql中使用預定義的異常,以便檢查使用者**的執行失敗的原因。這些異常定義在oracle的核心pl/sql庫中,使用者可以在自己的pl/sql異常處理部分使用名稱對其進行標識。對這種異常情況的處理,使用者無需在程式中定義,oracle自己引發。

2>非預定義異常非預定義異常資料庫本身不知道,不能控制的錯誤。例如,操作型別崩潰;oracle伺服器錯誤;網路或者機器i/o錯誤等。對這種異常情況的處理,需要使用者在程式中定義,然後由oracle自動引發。

3>使用者定義異常違反業務邏輯時,開發人員明確定義並引發的異常。

1、預定義異常

當pl/sql程式違反了oracle的規定或超出了系統規定的限制時,就會隱式地引發乙個預定義異常錯誤。下面是常見的預定義異常。

系統預定義異常

系統定義異常說明

access_info_null

試圖為某個未初始化物件的屬性賦值。

case_not_found

在case語句中未包含相應相應的when字句,並且沒有設定else語句。

collection_is_null

集合元素未初始化

cursor_already_open

試圖開啟乙個已經開啟的游標。游標在重新開啟之前,必須關閉。

dup_val_on_index

試圖在乙個唯一性索引的列中儲存冗餘值

invalid_cursor

執行乙個非法的游標操作,例如關閉乙個未開啟的游標。

invalid_number

試圖將乙個字串轉換為乙個無效的數字。

login_denied

試圖使用無效的使用者名稱和密碼連線資料庫

no_data_found

select into語句沒有返回資料,或者試圖訪問巢狀表中語句被刪除的元素或未初始化的元素。

not_logined_error

試圖在沒有連線資料的情況下訪問資料的內容。

program_error

pl/sql內部問題,可能需要重灌資料字典和pl/sql系統包。

row_type_mismatch

主游標變數與pl/sql變數的返回型別不同。

self_is_null

使用物件型別時,在null物件上呼叫物件方法。

storage_error

pl/sql程式使用完了記憶體或記憶體遭到破壞。

subscript_beyond_count

元素下標超過巢狀表或varray的最大值。

subscript_outside_limit

試圖使用非法索引號引用巢狀表或varray中的元素。

sys_invalid_rowid

字串向rowid轉換時的錯誤。

timeout_on_resource

oracle在等待資源是超時。

too_many_rows

執行select into語句時,結果集大於一行。

value_error

賦值時,變數長度不足以容納實際資料。

zero_divide

除數為0.

sql> set serveroutput on

sql> begin

2 insert into emp(empno, ename,job,sal,deptno)

3 values(7369, 'atg', 'tim', 1500, 20);

4 exception

5 when dup_val_on_index then

6 dbms_output.put_line('捕獲dup_val_on_index 異常');

7 dbms_output.put_line('該主鍵值已經存在');

8 end;

9 /

捕獲dup_val_on_index 異常

該主鍵值已經存在

pl/sql 過程已成功完成。

上邊的例子試圖使用已經存在的主鍵值向emp表新增新記錄,這會因為違法主鍵約束而發生錯誤。

sql> set serveroutput on

sql> declare

2 emp_row emp%rowtype;

3 begin

4 select *

5 into emp_row

6 from emp

7 where deptno = 10;

8 exception

9 when others then

10 dbms_output.put_line('異常錯誤(' || sqlcode || ')');

11 dbms_output.put_line(sqlerrm);

12 end;

13 /

異常錯誤(-1422)

ora-01422: 實際返回的行數超出請求的行數

pl/sql 過程已成功完成。

2、非預定義異常

在乙個異常產生、**獲並處理之前,它必須被定義。oracle定義了幾千個異常,絕大多數只有錯誤編號和相關描述,僅僅命名少量最常用的異常,即系統定義異常。

除此之外的絕大多數異常都未命名,這些異常就是非預定義異常,它們需要程式設計師對其命名。當然,只使用錯誤碼也可以完成異常的處理,但是這種異常處理會使**可讀性非常差。為非預定義異常命名時,需要使用 pragma exception_init 語句為錯誤號關聯乙個名稱,隨後就可以向系統預定義異常一樣進行處理。exception_init是編譯時執行的乙個函式,它只能出現在**的宣告部分,而異常名必須在此之前被定義。下邊為-2292 關聯了乙個名稱:

sql> set serveroutput on

sql> declare

2 invalid_company_id exception;

3 fk_delete_exception exception;

4 pragma exception_init(fk_delete_exception, -2292);

5 begin

6 delete from dept

7 where dname='sales';

8 exception

9 when fk_delete_exception then

10 dbms_output.put_line('該專案存在於另乙個列表中。');

11 end;

12 /

該專案存在於另乙個列表中。

pl/sql 過程已成功完成。

在上面的例子中,由於要刪除的部門仍在在emp表中引用,所以提示外來鍵引用。

3、使用者定義異常

系統預定義和非預定義異常都是有oracle判斷的錯誤,在實際的應用中,開發人員可以根據具體的業務規則自定義異常。

sql> set serveroutput on

sql> declare

2 salary_error exception; -- 定義薪金異常

3 var_sal emp.sal%type;

4 begin

5 6 select sal into var_sal from emp

7 where empno = 7369;

8 9 if var_sal <= 800 then

10 raise salary_error; -- 丟擲異常

11 end if;

12 exception

13 when salary_error then

14 dbms_output.put_line('窮人');

15 end;

16 /

窮人pl/sql 過程已成功完成。

sql> set serveroutput on

sql> declare

2 var_comm number;

3 begin

4 select comm

5 into var_comm

6 from emp

7 where ename='turner';

8 9 if var_comm = 0 then

10 raise zero_divide; -- 丟擲系統異常

11 end if;

12 exception

13 14 when zero_divide then

15 dbms_output.put_line('補貼為0!');

16 end;

17 /

補貼為0!

pl/sql 過程已成功完成。

Spring Boot學習筆記8 統一異常處理

雖然,spring boot中實現了預設的error對映,但是在實際應用中,預設的錯誤頁面對使用者來說並不夠友好,我們通常需要去實現我們自己的異常提示。下面我們以之前的spring bootx學習筆記7 使用thymeleaf模板引擎渲染web檢視為基礎,進行統一異常處理的改造。public cla...

學習筆記 12 python入門 異常處理

立即學習 1.file open 123.txt r r 去讀乙個檔案,如果能開啟就可以 寫入 2.try 嘗試執行需要執行的語句,如有出錯則按照安排好的預案執行。假設目前開啟的路徑沒有123.txt 這個檔案 file open 123.txt r except exception as e 將e...

Oracle 12C 安裝異常

報錯 一 ins 30131 1.以管理員執行setup.exe 2.管理員要有c盤的讀寫許可權 控制面板 所有控制面板項 管理工具 計算機管理 系統工具 共享資料夾 共享 3.regedit hkey local machine system currentcontrolset services ...