plsql异常处理

一、异常

   (1) 程序错误

   - 编译时

   - 运行时

   (2)异常

   - 处理运行时错误

  .PL/SQL是如何处理异常的?

   -  错误引发异常

   -  每当引发异常时,都将控制权传递给异常处理程序

   -  异常处理程序处理异常

  .异常中涉及的步骤

   -  声明异常

   -  引发异常

   -  处理异常

  .异常的类型

   -  预定义的异常   --由Oracle服务器维护异常

   -  非预定义的异常 又称'用户定义异常'

  1、预定义异常

   由Oracle为常见错误预定义

   在DBMS_Standard程序包中提供了这些定义

   不需要显式声明

declare
   empJob emp.job%type;
begin
  select job into empjob from emp where empno=0000;
  DBMS_output.put_line('Employee job is '||emjob);
Exception
  when No_data_found then
     DBMS_output.put_line('错误了,查询没有返回行');
  when too_many_rows then
     DBMS_output.put_line('错误了,查询返回了多条数据');
  when zero_divide  then
     DBMS_output.put_line('错误了,除数不能为零');
  when others then  --一定是最后一个处理的代码
      DBMS_output.put_line('错误了,未知的错误信息');
end;

 

2、非预定义异常

   无法预知的错误,如网络不通、服务没有启动、或其他错误,这样的异常需要用户要定义

declare
   PK_conflict Exception;  --用户定义异常
   iCount int:=0;
begin
   select count(*) into iCount from emp where empno='7369'
   if iCount>0 then
       raise   Dup_Value;  --引发异常
   end if;
Exception
    when PK_conflict  then   --处理异常
      DBMS_output.put_line('表中已经有这条记录了');
end;
/

 

以上代码的问题是,只有条件满足 才会引发异常,否则永远都不会执行此句.

  并且当有多个语句都有可能会引发此异常时,代码就过于冗余.并且都要显示

  的引发异常,能不能让系统帮我们维护自定义异常了,当有异常引发时 自动

  通知Oracle服务器处理异常

  3、pragma指令

declare
   PK_conflict Exception;  --用户定义异常
   pragma  Exception_init(PK_conflict -1);  --编译指令 可以把异常捆绑到Oracle 并覆盖预定义的异常 
   iCount int:=0;                                     这里的-1 代表主键冲突
begin
   insert into emp(empno,ename) values('7369','FeiYang');
Exception
    when PK_conflict then   --处理异常
      DBMS_output.put_line('表中已经有这条记录了,主键冲突');
end;

 

为了给用户友好的错误提示.用此函数可以定义友好的提示。

DBMS_output.put_line()函数只有sqlPlus 客户端支持.
Raise_Application_Error 
  .用于创建用户定义的错误消息的过程
  .可以再执行部分和异常部分使用
  .必须介于 -20000 和 -20999之间
  .可以存储2M的错误信息
declare
   PK_conflict Exception;  --用户定义异常
   pragma  Exception_init(PK_conflict -1);  --编译指令
   iCount int:=0;
begin
   insert into emp(empno,ename) values('7369','FeiYang');
Exception
    when PK_conflict then   --处理异常
      Raise_Application_Error(-20001,'表中已经有这条记录了'); --注意参数的前后顺序
end;

 

常见系统异常参考表:

1命名的系统异常               产生原因 
 2 access_into_null            未定义对象 
 3 CASE_NOT_FOUND           CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 
 4 COLLECTION_IS_NULL        集合元素未初始化 
 5 CURSER_ALREADY_OPEN        游标已经打开 
 6 DUP_VAL_ON_INDEX         唯一索引对应的列上有重复的值 
 7 INVALID_CURSOR           在不合法的游标上进行操作 
 8 INVALID_NUMBER           内嵌的 SQL 语句不能将字符转换为数字 
 9 NO_DATA_FOUND           使用 select into 未返回行,或应用索引表未初始化的元素时 
10 TOO_MANY_ROWS           执行 select into 时,结果集超过一行 
11 ZERO_DIVIDE             除数为 0 
12 SUBSCRIPT_BEYOND_COUNT      元素下标超过嵌套表或 VARRAY 的最大值 
13 SUBSCRIPT_OUTSIDE_LIMIT        使用嵌套表或 VARRAY 时,将下标指定为负数 
14 VALUE_ERROR             赋值时,变量长度不足以容纳实际数据 
15 LOGIN_DENIED             应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码 
16 NOT_LOGGED_ON            PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据 
17 PROGRAM_ERROR           PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包 
18 ROWTYPE_MISMATCH         宿主游标变量与 PL/SQL 游标变量的返回类型不兼容 
19 SELF_IS_NULL             使用对象类型时,在 null 对象上调用对象方法 
20 STORAGE_ERROR            运行 PL/SQL 时,超出内存空间 
21 SYS_INVALID_ID            无效的 ROWID 字符串 
22 TIMEOUT_ON_RESOURCE       Oracle 在等待资源时超时 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值