savepoint 与raise_application_error结合应用

在IFS ERP中经常使用Error_SYS包进行处理异常,比如 

  IF front_mark_no_ IS NULL OR side_mark_no_ IS NULL THEN
      Error_Sys.Record_General( lu_name_, 'DJ_CUSTMARKNULL: Order No :P1 Front Mark Or Side Mark No Is Null, Not Allow Release !',
                                order_no_ );
   END IF;


打开过程Error_Sys.Record_General过程
PROCEDURE Record_General (
   lu_name_  IN VARCHAR2,
   err_text_ IN VARCHAR2,
   p1_       IN VARCHAR2 DEFAULT NULL,
   p2_       IN VARCHAR2 DEFAULT NULL,
   p3_       IN VARCHAR2 DEFAULT NULL )
IS
BEGIN
   text_ := Nls_Msg___(lu_name_, err_text_, p1_, p2_, p3_);
   raise_application_error(-20110, lu_name_||'.'||text_);
END Record_General;

可以看到raise_application_error抛给客户端的错误信息,由于IFS ERP客户端封装好相关事务,故碰到任何Error_Sys返回的错误消息都回滚.

现在简单介绍一下raise_application_error相关事项:
1、raise_application_error内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息;
2、raise_application_error函数能够在pl/sql程序块的执行部分和异常部分调用,显式抛出带特殊错误号的命名异常;
3、使用语法:raise_application_error(error_no,error_message[,{true|| false}]);
4、错误号的范围是-20,001到-20,999;错误信息是文本字符串,最多为2048字节;true和false表示是添加(true)进错误堆(error stack)还是覆盖(overwrite)错误堆(false)。缺省情况下是false。
从raise_application_error和savepoint结合事务使用,可以由raise_application_error返回业务逻辑判断的信息给客户端,这样只需在数据库操作业务

DECLARE  
     forwarder_no_  VARCHAR2(30);
BEGIN  
   SAVEPOINT a_work;  
   forwarder_no_ := 'A';
    INSERT  
      INTO dj_forwarder_info_tab (  
         forwarder_no,--主键   
         cust_description,  
         description,  
         tel,  
         fax,  
         link_man,  
         email,  
         msn,  
         note_text,  
         rowversion)  
      VALUES (  
        forwarder_no_,  
        'test',  
        'test',  
        'test',  
        'test',  
        'test',  
        'test',  
        'test',  
        'test',  
         SYSDATE); 
     ---业务逻辑上的判断       
     IF forwarder_no_ = 'A' THEN
        raise_application_error(-20140, '1.已存在该货贷号');  
     END IF;  
     --
   forwarder_no_ := 'AB';
    INSERT  
      INTO dj_forwarder_info_tab (  
         forwarder_no,  
         cust_description,  
         description,  
         tel,  
         fax,  
         link_man,  
         email,  
         msn,  
         note_text,  
         rowversion)  
      VALUES (  
        forwarder_no_,----主键重复添加A,发生错误   
        'test',  
        'test',  
        'test',  
        'test',  
        'test',  
        'test',  
        'test',  
        'test',  
         SYSDATE); 
     ---业务逻辑上的判断
     IF forwarder_no_ = 'A' THEN
        raise_application_error(-20140, '2.已存在该货贷号');  
     END IF;  
   COMMIT;  
EXCEPTION  
   WHEN OTHERS THEN  
        dbms_output.put_line(SQLERRM);  
        ROLLBACK TO a_work; ---回滚事务,添加不成功         
        COMMIT;  
END Import_Inv_Part;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值