玩转Oracle-PL/SQL异常学习笔记

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值