玩轉Oracle PL SQL異常學習筆記

2021-06-21 05:09:30 字數 3282 閱讀 4396

oracle將例外分為預定義例外,非預定義例外和自定義例外三種

①、預定義例外處理常見的

oracle

錯誤;②、非預定義例外處理預定義例外不能處理的例外;

③、自定義例外處理與

oracle

無關的其他情況;

i) 預定義例外:預定義例外是由pl/sql所提供的系統例外。當pl/sql應用程式違反了oracle規定的限制時候,則會隱含觸發乙個內部例外。pl/sql為開發人員提供了二十多種預定義例外;

ii)非預定義例外:用於處理與預定義例外無關的oracle

錯誤,使用預定義例外只能處理

oracle

已經定義好了的

oracle

錯誤,而當使用

pl/sql

開發時候,可能會遇到其他一些錯誤,比如在

pl/sql

塊中執行

dml語句時候,違反了約束規定等等。

iii) 

預定義例外和非預定義例外都是與oracle

錯誤相關的,並且出現的

oracle

錯誤會隱含的觸發相應的例外;而自定義例外和

oracle

錯誤沒有任何關聯,它是由開發人員在特定情況下定義的例外;

常見預處理例外:

1. case_not_found;

在開發pl/sql

的時候,編寫

case

語句時候,如果在

when

子句中沒有包含必須的分支,就會觸發此例外;

create or replace procedure mypro(spno number) is

v_sal emp.sal%type;

begin

select sal into v_sal from emp where empno=spno;

case

when v_sal<1000 then

update emp set sal=sal+100 where empno=spno;

when v_sal<2000 then

update emp set sal=sal+200 where empno=spno;

end case;

exception

when case_not_found then

dbms_output.put_line('case語句中沒有與'||v_sal||'想匹配的條件');

end mypro;

2. cursor_already_open:

當重新開啟已經開啟的游標時候,就會隱含的觸發例外

3. dup_val_on_index:

在唯一索引對應的列上插入重複的值時候,就會觸發此例外;

4. invalid_cursor:

當試圖在不合法的游標上執行操作時候,就會觸發該例外;

例如:試圖從沒有開啟的游標中讀取資料或關閉沒有開啟的游標

5. invalid_number:

當輸入資料有誤時候,會觸發該例外

6. no_data_found

這個需要說明, 如果where條件裡面的ename對應的值不存在, 會報錯, 而不是向v_sal裡面寫空值

declare

v_sal emp.sal%type;

begin

select sal into v_sal from emp where ename='&me';

exception

when no_data_found then

dbms_output.put_line('不存在該員工');

end;

7. too_many_rows:

在執行select

語句時候,如果返回超過了一行,就會觸發該例外:

8. zero_divide

9. value_error:

當執行賦值操作的時候,如果變數的長度不足以容納實際資料,則會觸發該例外

10. login_denide:

當使用者非法登入時候,會觸發該例外;

11. not_logged_on:

如果使用者沒有登入就執行dml操作,就會觸發該例外

12. 

storage_error

:如果超出了記憶體空間或是記憶體被損壞,就會觸發該事件

13. 

timeout_on_resource:

如果oralce在等待資源時候,出現了超時就會觸發該例外;

自定義例外的說明:

--自定義例外;

create or replace prcedure mypro(spno number) is

begin

--更新使用者;

update emp set sal=sal+1000 where empno=spno;

end mypro;

當執行的時候,如果輸入34

,不會出現異常,因為在更新的時候,

oracle

直接認為使用者不存在就是了; 但是

--預定義例外;

create or replace prcedure mypro(spno number) is

begin

--查詢使用者;

select sal from emp where empno=spno;

end mypro;

當執行的時候,如果輸入

34,會出現異常,因為在查詢的時候,

oracle

會認為他是乙個異常;

這時候,如果我們希望第一種更新的情況作出提示,我們就需要自定義例外:

--自定義例外;

create or replace procedure mypro(spno number) is

--定義乙個例外;

myex exception;

begin

--更新使用者sal;

update emp set sal=sal+1000 where empno=spno;

--sql%notfound表示sql沒有更新成功;

if sql%notfound then

--raise myex: 觸發myex;

raise myex;

end if;

exception

when myex then

dbms_output.put_line('沒有更新任何資料');

end;

Oracle PL SQL異常處理

case語句語法格式如下 case 變數 when 表示式1 then 值1 when 表示式2 then 值2 when 表示式n then 值n else 值n 1 end 1 使用case語句寫乙個pl sql塊,要求輸入員工編號,根據員工的職位進行工資提公升,提公升要求如下 如果職位是cle...

Oracle PL SQL異常處理

oracle的exception init編譯指令declare exception name exception pragma exception init exception name,error code 下面給乙個例項 declare v num number sv num v result...

ORACLE PLSQL 異常處理

例一 create table testerr id number 10 name varchar2 10 insert into testerr values 1,test insert into testerr values 2,test insert into testerr values 3...