Oracle EBS标准并发程序(Auto Invoice Master)完成后邮件通知方案咨询
Oracle E-Business Suite Auto Invoice 邮件通知解决方案
以下是几种可靠的实现思路,附代码片段和关键注意事项:
方案1:并发程序后处理程序(推荐)
通过给Auto Invoice Master程序绑定自定义后处理程序,在程序执行完成后自动触发邮件通知。
步骤
- 注册一个PL/SQL类型的自定义并发程序,关联下面的包过程。
- 进入「系统管理员职责 -> 并发 -> 程序 -> 定义」,找到Auto Invoice Master Program,在「后处理」字段选择你的自定义程序。
核心代码
CREATE OR REPLACE PACKAGE auto_inv_notification AS PROCEDURE send_status_email ( errbuf OUT VARCHAR2, retcode OUT VARCHAR2 ); END auto_inv_notification; / CREATE OR REPLACE PACKAGE BODY auto_inv_notification AS PROCEDURE send_status_email ( errbuf OUT VARCHAR2, retcode OUT VARCHAR2 ) IS l_request_id NUMBER := fnd_global.conc_request_id; l_status VARCHAR2(30); l_subject VARCHAR2(100); l_message VARCHAR2(2000); l_recipient VARCHAR2(200) := 'your_notify_email@domain.com'; -- 替换为实际收件人邮箱 BEGIN -- 获取当前请求的最终状态 SELECT phase_code || '-' || status_code INTO l_status FROM fnd_concurrent_requests WHERE request_id = l_request_id; -- 构建邮件内容 CASE l_status WHEN 'C-S' THEN l_subject := 'Auto Invoice 执行成功'; l_message := 'Auto Invoice Master Program(请求ID: ' || l_request_id || ')已成功完成。'; WHEN 'C-E' THEN l_subject := 'Auto Invoice 执行失败'; l_message := 'Auto Invoice Master Program(请求ID: ' || l_request_id || ')执行失败,请登录系统查看请求日志。'; WHEN 'C-W' THEN l_subject := 'Auto Invoice 执行存在警告'; l_message := 'Auto Invoice Master Program(请求ID: ' || l_request_id || ')执行完成,但存在警告,请登录系统查看请求日志。'; ELSE l_subject := 'Auto Invoice 状态未知'; l_message := 'Auto Invoice Master Program(请求ID: ' || l_request_id || ')当前状态:' || l_status; END CASE; -- 调用EBS内置API发送邮件 fnd_notification.send( recipient => l_recipient, subject => l_subject, message => l_message, sender => fnd_profile.value('MAIL_SENDER_ADDRESS') ); retcode := '0'; errbuf := '通知邮件已发送'; EXCEPTION WHEN OTHERS THEN retcode := '2'; errbuf := '邮件发送失败: ' || SQLERRM; END send_status_email; END auto_inv_notification;
注意事项
- 确保并发程序执行用户拥有
FND_NOTIFICATION包的执行权限。 - 检查系统配置文件
MAIL_SENDER_ADDRESS和SMTP_HOST_ADDRESS是否正确配置,保证EBS能正常连接邮件服务器。
方案2:数据库状态监听触发器
通过监听FND_CONCURRENT_REQUESTS表的状态变化,触发邮件通知。
核心代码
CREATE OR REPLACE TRIGGER auto_inv_status_trigger AFTER UPDATE OF status_code, phase_code ON fnd_concurrent_requests FOR EACH ROW DECLARE l_program_short_name VARCHAR2(30); l_recipient VARCHAR2(200) := 'your_notify_email@domain.com'; l_subject VARCHAR2(100); l_message VARCHAR2(2000); BEGIN -- 仅针对Auto Invoice Master Program(短名称为RAXMTR,可根据实际版本查询确认) SELECT short_name INTO l_program_short_name FROM fnd_concurrent_programs WHERE concurrent_program_id = :new.concurrent_program_id AND application_id = :new.application_id; IF l_program_short_name = 'RAXMTR' AND :new.phase_code = 'C' THEN CASE :new.status_code WHEN 'S' THEN l_subject := 'Auto Invoice 执行成功'; l_message := '请求ID: ' || :new.request_id || ' - Auto Invoice已成功完成。'; WHEN 'E' THEN l_subject := 'Auto Invoice 执行失败'; l_message := '请求ID: ' || :new.request_id || ' - Auto Invoice执行失败,请查看请求日志。'; WHEN 'W' THEN l_subject := 'Auto Invoice 执行有警告'; l_message := '请求ID: ' || :new.request_id || ' - Auto Invoice完成但有警告,请查看请求日志。'; END CASE; fnd_notification.send( recipient => l_recipient, subject => l_subject, message => l_message, sender => fnd_profile.value('MAIL_SENDER_ADDRESS') ); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; -- 非目标程序,忽略 WHEN OTHERS THEN -- 记录错误,避免触发器异常影响原并发程序 INSERT INTO custom_alert_errors (error_msg, log_date) VALUES ('Auto Invoice通知触发器报错: ' || SQLERRM, SYSDATE); END; /
注意事项
- 触发器必须包含异常捕获逻辑,防止因邮件发送失败导致并发程序执行异常。
- 确认
FND_CONCURRENT_PROGRAMS中Auto Invoice的短名称是否为RAXMTR,不同版本可能有差异。
方案3:排查原有Alert未生效的问题
若想继续使用Alert功能,检查以下几点:
- 触发条件:确认Alert是否正确监听
FND_CONCURRENT_REQUESTS表,过滤条件是否包含Auto Invoice的程序ID/短名称,且状态为完成(phase_code='C')。 - 动作配置:检查Alert的邮件动作是否正确设置,收件人邮箱、邮件模板内容无误。
- Alert日志:进入「系统管理员职责 -> 预警 -> 历史」,查看Alert执行记录,是否存在权限不足、邮件服务器连接失败等报错。
- Alert管理器:确认
Alert Manager并发程序是否正常运行,未被挂起或终止。
通用配置检查
无论采用哪种方案,都需要确保:
- EBS邮件服务器配置正确,可通过发送测试邮件验证。
- 执行用户拥有
FND_CONCURRENT_REQUESTS、FND_CONCURRENT_PROGRAMS表的查询权限,以及FND_NOTIFICATION包的执行权限。
内容的提问来源于stack exchange,提问作者Nayan Semwal
相关产品推荐
相关产品推荐

