加入收藏
大学数学, 研究生数学,大学数学资料下载,免费 大学数学课件,研究生数学课件,免费下载
Oracle存储过程的异常处理
2015-11-24 19:06:13
为了提高存储过程的健壮性,避免运行错误,当建立存储过程时应包含异常处理部分。
异常(EXCEPTION)是一种PL/SQL标识符,包括预定义异常、非预定义异常和自定义异常;
预定义异常是指由PL/SQL提供的系统异常;非预定义异常用于处理与预定义异常无关的Oracle错误(如完整性约束等);自定义异常用于处理与Oracle错误的其他异常情况。
RAISE_APPLICATION_ERROR用于自定义错误消息,并且消息号必须在-20000~-20999之间

Oracle数据库中提供了一些异常处理的方法,下面通过一个实例来说明
create or replace procedure stu_proc6(pno in student.sno%type,pname out student.sname%type)
       is
       begin
          select sname into pname from student where sno=pno;
       EXCEPTION
                 when NO_DATA_FOUND then
                RAISE_APPLICATION_ERROR
(-20011,'ERROR:不存在!');

end;

Oracle提供的异常处理

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

自定义异常处理:
create or replace procedure stu_proc7(pno in student.sno%type,
       pon in student.sno%type
       )
       is
           v_raise exception;
           v_name student.sname%type;
       begin
         if pno=101 then
           raise v_raise;
           end if;
           select sname into v_name from student where sno=111111;
       exception
           when v_raise then
             RAISE_APPLICATION_ERROR(-20010,'ERROR:not existed!');
           when no_data_found then
             RAISE_APPLICATION_ERROR(-20011,'ERROR:不存在!');
end;

存储过程的事务处理
事务用于确保数据的一致性,由一组相关的DML语句组成,该组DML语句所执行的操作要么全部确认,要么全部取消。
当执行事务操作(DML)时,Oracle会在被作用的表上加锁,以防止其他用户改变表结构,同时也会在被作用的行上加行锁,以防止其他事务在相应行上执行DML操作。
当执行事务提交或事务回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点、释放锁。

提交事务(COMMIT)确认事务变化,结束当前事务、删除保存点,释放锁,使得当前事务中所有未决的数据永久改变。
保存点(SAVEPOINT)在当前事务中,标记事务的保存点。
回滚事务(ROLLBACK)回滚整个事务,删除该事务所定义的所有保存点,释放锁,丢弃所有未决的数据改变。
回滚事务到指定的保存点(ROLLBACK TO SAVEPOINT)回滚当前事务到指定的保存点,丢弃该保存点创建后的任何改变,释放锁。

当执行DDL、DCL语句,或退出SQL*PLUS时,会自动提交事务;
事务期间应避免与使用者互动;
查询数据期间,尽量不要启动事务;
尽可能让事务持续地越短越好;

在事务中尽可能存取最少的数据量。

存储过程事务处理实例:
create or replace procedure stu_proc8
       is
       begin
         insert into student values(102,'sky','m',22,'gong');
         savepoint savepoint1;
         insert into student values(102,'good','w',20,'wang');
         dbms_output.put_line('error');
         update student set sno=103 where sname='good';
         commit;
         exception
           when dup_val_on_index then
             rollback to savepoint savepoint1;
             RAISE_APPLICATION_ERROR(-20010,'ERROR:违反唯一索引约束!');
        end;

赞一个(59) | 阅读(1149)
上一篇:Oracle存储过程基础和实例
下一篇:Oracle数据库函数和存储过程的包
 

胡桃木屋版权所有@2013 湘ICP备13006789号-1