Het zou over het algemeen een slecht idee zijn om te proberen een e-mail te verzenden in een trigger.
- Als het systeem de e-mail niet kan verzenden (bijvoorbeeld omdat de SMTP-server tijdelijk niet beschikbaar is), mislukt de trigger en mislukt de triggerverklaring en wordt deze teruggedraaid. Het komt zelden voor dat u de onderliggende transactie echt wilt stoppen, simpelweg omdat u geen e-mail kunt verzenden.
- Het verzenden van een e-mail is niet-transactioneel. Dat betekent dat u e-mails verzendt voor wijzigingen die nooit worden vastgelegd. En u zult meerdere keren e-mails verzenden omdat Oracle ervoor kiest om een
INSERT
geheel of gedeeltelijk terug te draaien en opnieuw uit te voeren statement om de schrijfconsistentie te behouden.
U bent over het algemeen veel beter af met een databasetaak die periodiek zoekt naar rijen waarvoor een e-mail moet worden verzonden, de e-mails verzendt en vervolgens de tabel bijwerkt. U kunt ofwel de oudere DBMS_JOB
pakket of het nieuwere en meer geavanceerde DBMS_SCHEDULER
pakket. Iets in de trant van
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;
die vervolgens, bijvoorbeeld, elke 5 minuten wordt uitgevoerd (u kunt ook de DBMS_SCHEDULER
gebruiken pakket)
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;
U kunt het UTL_MAIL-pakket
gebruiken om de send_email
. te implementeren procedure. U hoeft waarschijnlijk alleen UTL_MAIL.SEND
. te bellen met de juiste parameters (ervan uitgaande dat u uw SMTP_OUT_SERVER
hebt geconfigureerd parameter en uw gebruiker heeft de juiste toegang gekregen tot de UTL_MAIL
pakket en naar een ACL waarmee u kunt communiceren met die SMTP-server).