Generalnie złym pomysłem byłoby próbowanie wysłania wiadomości e-mail w wyzwalaczu.
- Jeśli system nie może wysłać wiadomości e-mail (na przykład z powodu tymczasowego wyłączenia serwera SMTP), wyzwalacz nie powiedzie się, a instrukcja wyzwalająca nie powiedzie się i zostanie wycofana. Bardzo rzadko zdarza się, że naprawdę chciałbyś zatrzymać podstawową transakcję tylko dlatego, że nie byłeś w stanie wysłać wiadomości e-mail.
- Wysyłanie wiadomości e-mail nie ma charakteru transakcyjnego. Oznacza to, że będziesz wysyłać e-maile dotyczące zmian, które nigdy nie zostaną zatwierdzone. Będziesz też wysyłać e-maile wiele razy, ponieważ Oracle zdecyduje się na wycofanie i ponowne wykonanie całości lub części
INSERT
oświadczenie w celu utrzymania spójności zapisu.
Ogólnie rzecz biorąc, znacznie lepiej obsłużysz zadanie bazy danych, które okresowo wyszukuje wiersze, do których należy wysłać wiadomość e-mail, wysyła wiadomości e-mail, a następnie aktualizuje tabelę. Możesz użyć starszego DBMS_JOB
pakiet lub nowszy i bardziej wyrafinowany DBMS_SCHEDULER
pakiet. Coś w stylu
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;
który jest następnie zaplanowany do uruchamiania, powiedzmy co 5 minut (można również użyć DBMS_SCHEDULER
pakiet)
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;
Możesz użyć pakietu UTL_MAIL
zaimplementować send_email
procedura. Prawdopodobnie wystarczy zadzwonić na UTL_MAIL.SEND
z odpowiednimi parametrami (zakładając, że skonfigurowałeś swój SMTP_OUT_SERVER
parametr i Twój użytkownik otrzymał odpowiedni dostęp do UTL_MAIL
i do listy ACL, która umożliwia komunikację z tym serwerem SMTP).