Det ville generelt være en dårlig idé at prøve at sende en e-mail i en trigger.
- Hvis systemet ikke er i stand til at sende e-mailen (f.eks. fordi SMTP-serveren midlertidigt er nede), vil triggeren mislykkes, og den udløsende erklæring vil mislykkes og blive rullet tilbage. Det er meget sjældent, at du virkelig ønsker at stoppe den underliggende transaktion, blot fordi du ikke var i stand til at sende en e-mail.
- At sende en e-mail er ikke-transaktionel. Det betyder, at du sender e-mails for ændringer, der aldrig bliver forpligtet. Og du vil sende e-mails flere gange, fordi Oracle vælger at rulle tilbage og genudføre hele eller dele af en
INSERT
erklæring for at bevare skrivekonsistens.
Du vil generelt være meget bedre tjent med et databasejob, der med jævne mellemrum leder efter rækker, der skal have sendt en e-mail, sender e-mails og derefter opdaterer tabellen. Du kan bruge enten den ældre DBMS_JOB
pakke eller den nyere og mere sofistikerede DBMS_SCHEDULER
pakke. Noget i stil med
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;
som derefter er planlagt til at køre, f.eks. hvert 5. minut (du kan også bruge DBMS_SCHEDULER
pakke)
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;
Du kan bruge UTL_MAIL-pakken
for at implementere send_email
procedure. Du skal sandsynligvis bare ringe til UTL_MAIL.SEND
med passende parametre (forudsat at du har konfigureret din SMTP_OUT_SERVER
parameter, og din bruger har fået passende adgang til UTL_MAIL
pakke og til en ACL, der giver dig mulighed for at kommunikere med den pågældende SMTP-server).