oracle存储过程3

来源:互联网 发布:c 多线程编程 视频 编辑:程序博客网 时间:2024/06/13 08:29

        为了提高存储过程的健壮性,避免运行错误,当建立存储过程时应包含异常处理部分。异常(EXCEPTION)是一种PL/SQL标识符,包括预定义异常、非预定义异常和自定义异常。预定义异常是指由PL/SQL提供的系统异常,非预定义异常用于处理与预定义异常无关的Oracle错误(如完整性约束等),自定义异常用于处理与Oracle错误的其他异常情况。RAISE_APPLICATION_ERROR用于自定义错误消息,并且消息号必须在-20000~-20999之间。

       Oracle数据库中提供了一些异常处理的方法,下面通过一个实例来说明。

   create or replace procedure acc2name(v_acc_no in com_item.acc_no%type, v_acc_name out com_item.acc_name%type)   is   begin            select acc_name into v_acc_name from com_item where acc_no=v_acc_no;            EXCEPTION            when NO_DATA_FOUND then                  RAISE_APPLICATION_ERROR(-20000,'ERROR:不存在!');   end;

       自定义异常处理:

   create or replace procedure acc2name(v_acc_no in com_item.acc_no%type, v_acc_name out com_item.acc_name%type)   is            v_raise exception;   begin            if v_acc_no='1001' then                  raise v_raise;            end if;            select acc_name into v_acc_name from com_item where acc_no=v_acc_no;            exception            when v_raise then                RAISE_APPLICATION_ERROR(-20000,'ERROR:没有权限!');            when no_data_found then                RAISE_APPLICATION_ERROR(-20001,'ERROR:不存在!');   end;

       事务用于确保数据的一致性,由一组相关的DML语句组成,该组DML语句所执行的操作要么全部确认,要么全部取消。当执行事务操作(DML)时,Oracle会在被作用的表上加锁,以防止其他用户改变表结构,同时也会在被作用的行上加行锁,以防止其他事务在相应行上执行DML操作。当执行事务提交或事务回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点、释放锁。保存点(SAVEPOINT)在当前事务中,标记事务的保存点。回滚事务到指定的保存点(ROLLBACK TO SAVEPOINT)回滚当前事务到指定的保存点,丢弃该保存点创建后的任何改变,释放锁。
       当执行DDL、DCL语句,或退出SQL*PLUS时,会自动提交事务;事务期间应避免与使用者互动;查询数据期间,尽量不要启动事务;尽可能让事务持续地越短越好;在事务中尽可能存取最少的数据量。
       存储过程事务处理实例:

   create or replace procedure ins_item   is   begin            insert into com_item(acc_no,acc_hrt,acc_name) values('1009','10900','ATM现金');            commit;            savepoint savepoint1;            insert into com_item(acc_no,acc_hrt,acc_name) values('1001','10100','库存现金');            commit;            exception            when dup_val_on_index then                rollback to savepoint savepoint1;                RAISE_APPLICATION_ERROR(-20010,'ERROR:违反唯一索引约束!');   end;

       Create or replace package 包名 as function 函数名,创建函数包,as后可加多个函数;
       Create or replace package 包名 as procedure 存储过程名,创建存储过程包,as后可加多个存储过程。
       包调用:call 包名.函数名(存储过程名)。

0 0
原创粉丝点击