Oracle EBS ERP开发 — 抛出异常EXCEPTION书写规范
在Oracle EBS ERP接口开发中,异常处理(EXCEPTION)是确保系统稳定性和可维护性的关键环节。规范的异常处理不仅能有效捕获错误,还能提供清晰的错误信息,便于问题排查和系统维护。
一:不规范
log_msg(' 下载PLM表开始>>>');
BEGINEXECUTE IMMEDIATE 'drop table cux_plm_item_0';
EXCEPTIONWHEN OTHERS THENNULL; -- 不规范的异常处理:静默忽略所有错误
END;
BEGINEXECUTE IMMEDIATE 'create table cux_plm_item_0 as select * from item_0@plm_link ';EXECUTE IMMEDIATE 'create index cux_plm_item_0_n1 on cux_plm_item_0(md_id) ';EXECUTE IMMEDIATE 'create index cux_plm_item_0_n2 on cux_plm_item_0(status) ';
EXCEPTIONWHEN OTHERS THENNULL; -- 不规范的异常处理:静默忽略所有错误
END;
log_msg(' 下载PLM表结束<<<');
问题分析:
- 异常处理块中只有
NULL
语句,完全忽略所有错误 - 没有记录错误日志,无法追踪问题
- 没有设置错误状态和错误信息
- 没有中断程序执行,可能导致后续操作基于错误状态继续运行
二:规范
log_msg(' 下载PLM表开始>>>');
BEGINEXECUTE IMMEDIATE 'drop table cux_plm_item_0';
EXCEPTIONWHEN OTHERS THENNULL; -- 删除表失败可以忽略(表可能不存在)
END;
BEGINEXECUTE IMMEDIATE 'create table cux_plm_item_0 as select * from item_0@plm_link ';EXECUTE IMMEDIATE 'create index cux_plm_item_0_n1 on cux_plm_item_0(md_id) ';EXECUTE IMMEDIATE 'create index cux_plm_item_0_n2 on cux_plm_item_0(status) ';
EXCEPTIONWHEN OTHERS THEN-- 1. 定义状态为错误和填写错误信息xv_return_status := fnd_api.g_ret_sts_error;xv_msg_data := '下载PLM表cux_plm_item_0出现错误.'|| SQLCODE || ' ' ||SQLERRM;-- 2. 对报错的代码重新以正确的方式执行EXECUTE IMMEDIATE 'create table cux_plm_item_0 as select * from DUAL ';EXECUTE IMMEDIATE 'create index cux_plm_item_0_n1 on cux_plm_item_0(md_id) ';EXECUTE IMMEDIATE 'create index cux_plm_item_0_n2 on cux_plm_item_0(status) ';-- 3. 日志打印错误信息和系统错误信息log_msg('下载PLM表cux_plm_item_0出现错误.'|| SQLCODE || ' ' ||SQLERRM);-- 中断执行return;
END;
log_msg(' 下载PLM表结束<<<');
规范的异常处理三大要素
1. 定义状态为错误和填写错误信息
在Oracle EBS开发中,标准API通常使用fnd_api.g_ret_sts_error
表示错误状态。规范的异常处理应包含:
EXCEPTIONWHEN OTHERS THEN-- 设置返回状态为错误xv_return_status := fnd_api.g_ret_sts_error;-- 填写详细的错误信息xv_msg_data := '自定义错误描述' || SQLCODE || ' ' || SQLERRM;
关键点:
- 使用
fnd_api.g_ret_sts_error
标准错误状态常量 - 错误信息应包含:业务描述 + 系统错误代码(
SQLCODE
) + 系统错误描述(SQLERRM
) - 错误信息应存储在标准变量
xv_msg_data
中供调用方使用
2. 对报错的代码重新以正确的方式执行
当关键操作失败时,应采取适当的补救措施或清理操作:
EXCEPTIONWHEN OTHERS THEN-- 创建空表作为补救措施EXECUTE IMMEDIATE 'create table cux_plm_item_0 as select * from DUAL ';-- 其他可能的补救措施:-- - 回滚事务-- - 清理临时数据-- - 释放资源
关键点:
- 根据业务需求设计合理的补救措施
- 确保补救措施本身不会引发新的异常
- 补救措施应保证系统处于一致状态
3. 日志打印错误信息和系统错误信息
规范的日志记录是问题排查的基础:
EXCEPTIONWHEN OTHERS THEN-- 记录详细错误日志log_msg('业务操作描述失败: ' || SQLCODE || ' - ' || SQLERRM);-- 可选:记录更多上下文信息log_msg('当前操作: 下载PLM表cux_plm_item_0');log_msg('参数值: p_param1=' || p_param1);
关键点:
- 使用标准日志函数(如
log_msg
) - 日志应包含:业务上下文 + 系统错误代码 + 系统错误描述
- 可添加关键参数值帮助定位问题
- 日志级别应合理设置(ERROR级别)