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;