PL/SQL复习八 异常

异常分类:

1. 预定义异常: 处理常见的oracle错误

2. 非预定义异常: 处理预定义异常之外不能处理的错误

3. 自定义异常: 处理和oracle错误无关的其他情况

 

declare

  v_ename emp.ename%type;

begin

  select ename into v_ename from emp where empno = &no;

  dbms_output.put_line('雇员名:' || v_ename);

exception --以下是异常处理部分

  when no_data_found then

    dbms_output.put_line('雇员号不正确,请核实雇员号!');

  when others then

    dbms_output.put_line('未知异常');

end;

/

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

常见预定义异常:

CURSOR_ALREADY_OPEN     ORA-6511  试图打开一个已打开的游标

DUP_VAL_ON_INDEX        ORA-0001  试图破坏一个唯一性限制

INVALID_CURSOR          ORA-1001  试图使用一个无效的游标

INVALID_NUMBER          ORA-1722  试图对非数字值进行数字操作

LOGIN_DENIED            ORA-1017  无效的用户名或者口令

NO_DATA_FOUND           ORA-1403  查询未找到数据

NOT_LOGGED_ON           ORA-1012  还未连接就试图数据库操作

PROGRAM_ERROR           ORA-6501  内部错误

ROWTYPE_MISMATCH        ORA-6504  主变量和游标的类型不兼容

STORAGE_ERROR           ORA-6500  内部错误

TIMEOUT_ON_RESOURCE     ORA-0051  发生超时

TOO_MANY_ROWS           ORA-1422  SELECT INTO命令返回的多行

TRANSACTION_BACKED_OUT  ORA-006   由于死锁提交被退回

VALUE_ERROR             ORA-6502  转换或者裁剪错误

ZERO_DIVIDE             ORA-1476  试图被零除

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

使用非预定义异常:deptno是外键,如果输入的deptno在dept表中不存在,就会触发异常

declare

  e_exception1 exception;--定义异常名

  pragma exception_init(e_exception1, -2291);--将异常和oracle错误之间建立关联

begin

  update emp set deptno = &dno where empno = &eno;

exception

  when e_exception1 then

    dbms_output.put_line('该部门不存在');

end;

/

 

 

使用自定义异常:

declare

  e_exception1 exception;

  pragma exception_init(e_exception1, -2291);

  e_no_employee exception; --自定义异常

begin

  update emp set deptno = &dno where empno = &eno;

  if sql%notfound then --如果人员不存在 

    raise e_no_employee; --则抛出自定义异常

  end if;

exception

  when e_exception1 then

    dbms_output.put_line('该部门不存在');

  when e_no_employee then

    dbms_output.put_line('该雇员不存在');

end;

/

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

异常函数:

sqlcode: 返回错误号

sqlerrm: 返回异常消息

exception

  when others then

    dbms_output.put_line('错误号:'||sqlcode);

    dbms_output.put_line('错误消息:'||sqlerrm);

 

raise_application_error: 用于自定义错误消息,只能在子程序(过程、函数、包、触发器中使用) 不能在匿名块和客户端的子程序中使用

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值