In genere sarebbe una cattiva idea provare a inviare un'e-mail in un trigger.
- Se il sistema non è in grado di inviare l'e-mail (ad esempio, perché il server SMTP è temporaneamente inattivo), l'attivazione avrà esito negativo e l'istruzione di attivazione avrà esito negativo e verrà eseguito il rollback. È molto raro che tu voglia davvero interrompere la transazione sottostante semplicemente perché non sei stato in grado di inviare un'email.
- L'invio di un'e-mail non è transazionale. Ciò significa che invierai e-mail per le modifiche che non vengono mai impegnate. E invierai e-mail più volte perché Oracle sceglie di eseguire il rollback e rieseguire tutto o parte di un
INSERT
dichiarazione al fine di mantenere la coerenza della scrittura.
In genere ti verrà servito molto meglio con un processo di database che cerca periodicamente le righe che devono ricevere un'e-mail, invia le e-mail e quindi aggiorna la tabella. Puoi utilizzare il vecchio DBMS_JOB
pacchetto o il più recente e sofisticato DBMS_SCHEDULER
pacchetto. Qualcosa sulla falsariga di
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;
che è quindi programmato per l'esecuzione, diciamo, ogni 5 minuti (potresti anche usare il DBMS_SCHEDULER
pacchetto)
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;
Puoi utilizzare il pacchetto UTL_MAIL
per implementare send_email
procedura. Probabilmente devi solo chiamare UTL_MAIL.SEND
con i parametri appropriati (supponendo che tu abbia configurato il tuo SMTP_OUT_SERVER
parametro e il tuo utente ha ottenuto l'accesso appropriato a UTL_MAIL
pacchetto e a un ACL che consente di comunicare con quel server SMTP).