Obecně by bylo špatné zkoušet poslat e-mail pomocí spouštěče.
- Pokud systém nemůže odeslat e-mail (například proto, že server SMTP je dočasně mimo provoz), spouštěč selže a spouštěcí příkaz selže a bude vrácen zpět. Je velmi vzácné, že byste skutečně chtěli zastavit podkladovou transakci jednoduše proto, že jste nebyli schopni odeslat e-mail.
- Odeslání e-mailu není transakční. To znamená, že budete posílat e-maily se změnami, které nikdy nebudou potvrzeny. A budete posílat e-maily vícekrát, protože Oracle se rozhodl vrátit zpět a znovu spustit celý nebo část
INSERT
prohlášení, aby byla zachována konzistence zápisu.
Obecně vám mnohem lépe poslouží databázová úloha, která pravidelně hledá řádky, které potřebují odeslat e-mail, odešle e-maily a poté aktualizuje tabulku. Můžete použít buď starší DBMS_JOB
balíček nebo novější a sofistikovanější DBMS_SCHEDULER
balík. Něco ve smyslu
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;
který je pak naplánován na spuštění, řekněme, každých 5 minut (můžete také použít DBMS_SCHEDULER
balíček)
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;
Můžete použít balíček UTL_MAIL
implementovat send_email
postup. Pravděpodobně stačí zavolat UTL_MAIL.SEND
s příslušnými parametry (za předpokladu, že jste nakonfigurovali SMTP_OUT_SERVER
a vašemu uživateli byl udělen odpovídající přístup k UTL_MAIL
balíčku a do ACL, který vám umožňuje komunikovat s tímto SMTP serverem).