Es wäre im Allgemeinen eine schlechte Idee, zu versuchen, eine E-Mail in einem Trigger zu senden.
- Wenn das System die E-Mail nicht senden kann (z. B. weil der SMTP-Server vorübergehend ausgefallen ist), schlägt der Trigger fehl und die auslösende Anweisung schlägt fehl und wird rückgängig gemacht. Es ist sehr selten, dass Sie die zugrunde liegende Transaktion wirklich stoppen möchten, nur weil Sie keine E-Mail senden konnten.
- Das Senden einer E-Mail ist nicht transaktional. Das bedeutet, dass Sie E-Mails für Änderungen senden, die nie festgeschrieben werden. Und Sie werden E-Mails mehrmals senden, weil Oracle sich dafür entscheidet, einen
INSERT
ganz oder teilweise zurückzusetzen und erneut auszuführen -Anweisung, um die Schreibkonsistenz aufrechtzuerhalten.
Im Allgemeinen sind Sie mit einem Datenbankjob viel besser bedient, der regelmäßig nach Zeilen sucht, die eine E-Mail senden müssen, die E-Mails sendet und dann die Tabelle aktualisiert. Sie können entweder den älteren DBMS_JOB
verwenden Paket oder das neuere und ausgefeiltere DBMS_SCHEDULER
Paket. Etwas in der Art von
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 dann so geplant ist, dass sie beispielsweise alle 5 Minuten ausgeführt wird (Sie könnten auch den DBMS_SCHEDULER
verwenden Paket)
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;
Sie können das UTL_MAIL-Paket
verwenden um den send_email
zu implementieren Verfahren. Sie müssen wahrscheinlich nur UTL_MAIL.SEND
aufrufen mit entsprechenden Parametern (vorausgesetzt, Sie haben Ihren SMTP_OUT_SERVER
konfiguriert -Parameter und Ihrem Benutzer wurde entsprechender Zugriff auf UTL_MAIL
gewährt Paket und an eine ACL, die es Ihnen ermöglicht, mit diesem SMTP-Server zu kommunizieren).