По принцип би било лоша идея да се опитате да изпратите имейл в тригер.
- Ако системата не може да изпрати имейла (например, защото 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
пакет и към ACL, който ви позволява да комуникирате с този SMTP сървър).