尝试在触发器中发送电子邮件通常是个坏主意。
- 如果系统无法发送邮件(例如,由于 SMTP 服务器暂时宕机),触发器将失败,触发语句将失败并回滚。您很少会因为无法发送电子邮件而真正想要停止基础交易。
- 发送电子邮件是非事务性的。这意味着您将针对从未提交的更改发送电子邮件。而且您将多次发送电子邮件,因为 Oracle 选择回滚并重新执行全部或部分
INSERT
语句以保持写入一致性。
通常使用数据库作业会更好地为您服务,该作业会定期查找需要发送电子邮件的行,发送电子邮件,然后更新表。您可以使用较旧的DBMS_JOB
包或更新和更复杂的DBMS_SCHEDULER
包。类似的东西
CREATE OR REPLACE PROCEDURE process_issues
AS
BEGIN
FOR i IN (SELECT *
FROM your_table_name
WHERE issue_added = 1
AND email_sent = 0)
LOOP
send_email( i.issue_id );
UPDATE your_table_name
SET email_sent = 1
WHERE issue_id = i.issue_id;
END LOOP;
END;
然后计划每 5 分钟运行一次(您也可以使用该DBMS_SCHEDULER
软件包)
DECLARE
l_jobno PLS_INTEGER:
BEGIN
dbms_job.submit( l_jobno,
'BEGIN process_issues; END;',
sysdate + interval '5' minute,
'sysdate + interval ''5'' minute' );
commit;
END;
您可以使用UTL_MAIL 包来实现该send_email
过程。您可能只需要UTL_MAIL.SEND
使用适当的参数进行调用(假设您已经配置了SMTP_OUT_SERVER
参数并且您的用户已被授予对UTL_MAIL
包和允许您与该 SMTP 服务器通信的 ACL 的适当访问权限)。