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;
源文地址: http://www.doc88.com/p-989349880146.html