ITPub博客

首页 > 数据库 > Oracle > 从零开始学Oracle—异常处理(八)

从零开始学Oracle—异常处理(八)

Oracle 作者:azadragon 时间:2013-06-21 01:12:07 0 删除 编辑

关键字: 分层查询 函数 触发器语法 Oracle物化视图 跟踪sql语句

本文详细介绍从零开始学Oracle—异常处理(八)

  一、异常

   (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物化视图 跟踪sql语句

本文详细介绍从零开始学Oracle—异常处理(八)

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

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

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

  通知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;

关键字: 分层查询 函数 触发器语法 Oracle物化视图 跟踪sql语句

本文详细介绍从零开始学Oracle—异常处理(八)

  常见系统异常参考表:

 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

  系列文章:

  从零开始学Oracle—环境配置(一)

  从零开始学Oracle—基本语法解析(二)

  从零开始学Oracle-—约束(三)

  从零开始学Oracle—内建函数(四)

  从零开始学Oracle—内建对象(五)

  从零开始学Oracle—性能对象(六)

  从零开始学Oracle—PL/SQL(七)

 

关键词:处理异常开始'

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22810982/viewspace-1116061/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-11-02