在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;