oracle 在存储过程自定义异常的处理方法

oracle 在存储过程自定义异常的处理方法:

oracle中-20000以上是给用户自定义异常使用的代码,可以根据这个原理自定义自己的异常提示信息。

也可以在存储过程中再次调用其他的存储过程。

下面是个例子仅供参考。

create or replace procedure Cover28DOC(p_DOCNO    varchar2,
                                       p_REDDOCNO varchar2,
                                       p_NEWDOCNO varchar2,
                                       p_VLDPSN   varchar2,
                                       p_RETURN IN  out integer) as
  --出库单红冲时, 可能会发生违反仓位规则,即‘货架’的规则。  在红单审核时, 会报错。

  --记录凭证名称
  v_DOCNAME varchar2(60);
  v_RTU     number(1);
  v_VALNO   varchar2(60);
  v_num     int;
begin
  v_DOCNAME := GetEBKDSC(2800 * 10000);
  p_RETURN  := 0;
  --未审核的单据不可红冲
  select count(1)
    into v_num
    from DOC28BF
   where valid = 0
     and docno = p_docno;
  if v_num > 0 then
    raise_application_error(-20000,
                            '您所要红冲的单据是不可红冲的,单据未审核。');
    return;
  end if;

  --已是红冲的单据不可红冲
  select count(1)
    into v_num
    from DOC28BF
   where ISCOVER = 1
     and docno = p_docno;
  if v_num > 0 then
    raise_application_error(-20000,
                            '您所要红冲的单据是不可红冲的,已是红冲的单据不可红冲。');
    return;
  end if;

  --已关帐的不可红冲
  select count(1)
    into v_num
    from DOC28BF
   where CLSVLD = 1
     and docno = p_docno;
  if v_num > 0 then
    raise_application_error(-20000,
                            '您所要红冲的单据是不可红冲的,已关帐的不可红冲。');
    return;
  end if;

  begin
    --更新单据,标不可红冲
    update DOC28BF set ISCOVER = 1 where DOCNO = p_DOCNO;

    update DOC28EXT
       set DSC = '红单为' || p_REDDOCNO || ';新兰单为' || p_NEWDOCNO || ';'
     where DOCNO = p_DOCNO;
  exception
    when others then
      rollback;
      raise_application_error(-20000,
                              '在将' || v_DOCNAME ||
                              '数据进行红冲时出错.原始错误号码是[' ||
                              sqlcode || '],原始错误信息是[' || sqlerrm || '].');
      return;
  end;

  --生成红冲单据, 并审核

  --生成主表
  begin
    insert into DOC28BF
      (DOCNO,
       OPTID,
       CTYP,
       SHPID,
       COMID,
       DOCDAT,
       INVNO,
       ISRED,
       ISCOVER,
       VALID)
      select p_REDDOCNO, OPTID, CTYP, SHPID, COMID, DOCDAT, INVNO, 1, 1, 0
        from DOC28BF
       where DOCNO = p_DOCNO;
  exception
    when others then
      rollback;
      raise_application_error(-20000,
                              '在将' || v_DOCNAME ||
                              '数据进行红冲时出错.原始错误号码是[' ||
                              sqlcode || '],原始错误信息是[' || sqlerrm || '].');
      return;
  end;

 

--审核红冲单(内部再次调用存储过程)
  begin
    Valid28DOC(p_REDDOCNO, p_VLDPSN, v_VALNO, v_RTU);
  exception
    when others then
      rollback;
      raise_application_error(-20000,
                              '在将' || v_DOCNAME ||
                              '数据进行红冲时出错.原始错误号码是[' ||
                              sqlcode || '],原始错误信息是[' || sqlerrm || '].');
      return;
  end;

  --生成新单据

 

  commit;

  p_RETURN := 1;

end Cover28DOC;

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值