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 ...