oracle 异常处理(转载)

来源:互联网 发布:mysql insert字段 编辑:程序博客网 时间:2024/05/23 10:33

一、异常

   (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服务器处理异常

  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 在等待资源时超时
23
24

原创粉丝点击