Nói chung sẽ là một ý tưởng tồi nếu bạn cố gắng gửi một email trong một trình kích hoạt.
- Nếu hệ thống không thể gửi email (ví dụ:do máy chủ SMTP tạm thời ngừng hoạt động), trình kích hoạt sẽ không thành công và câu lệnh kích hoạt sẽ không thành công và được khôi phục lại. Rất hiếm khi bạn thực sự muốn dừng giao dịch cơ bản chỉ vì bạn không thể gửi email.
- Gửi email không mang tính chất giao dịch. Điều đó có nghĩa là bạn sẽ gửi email cho những thay đổi không bao giờ được cam kết. Và bạn sẽ gửi email nhiều lần vì Oracle chọn khôi phục và thực thi lại tất cả hoặc một phần của
INSERT
để duy trì tính nhất quán của văn bản.
Nói chung, bạn sẽ được phục vụ tốt hơn nhiều với công việc cơ sở dữ liệu định kỳ tìm kiếm các hàng cần gửi email, gửi email và sau đó cập nhật bảng. Bạn có thể sử dụng DBMS_JOB
cũ hơn gói hoặc DBMS_SCHEDULER
mới hơn và phức tạp hơn bưu kiện. Một cái gì đó dọc theo dòng của
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;
sau đó được lên lịch chạy, chẳng hạn, cứ sau 5 phút (bạn cũng có thể sử dụng DBMS_SCHEDULER
gói)
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;
Bạn có thể sử dụng gói UTL_MAIL
để triển khai send_email
thủ tục. Bạn có thể chỉ cần gọi UTL_MAIL.SEND
với các tham số thích hợp (giả sử bạn đã định cấu hình SMTP_OUT_SERVER
của mình và người dùng của bạn đã được cấp quyền truy cập thích hợp vào UTL_MAIL
và với một ACL cho phép bạn giao tiếp với máy chủ SMTP đó).