嘗試在觸發器中發送電子郵件通常不是個好主意。
- 如果系統無法發送電子郵件(例如,因爲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 package實施send_email
程序。您可能只需使用適當的參數調用UTL_MAIL.SEND
(假設您已配置了SMTP_OUT_SERVER
參數,並且您的用戶已被授予對UTL_MAIL
程序包的適當訪問權並且允許您與該SMTP服務器通信的ACL)。