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