通常、トリガーで電子メールを送信しようとするのはお勧めできません。
- システムが電子メールを送信できない場合 (SMTP サーバーが一時的にダウンしているなどの理由で)、トリガーは失敗し、トリガーステートメントは失敗してロールバックされます。電子メールを送信できなかったという理由だけで、基になるトランザクションを本当に停止したいということはほとんどありません。
- 電子メールの送信は非トランザクションです。つまり、コミットされない変更についてメールを送信することになります。
INSERT
また、Oracle は書き込みの一貫性を維持するためにステートメントのすべてまたは一部をロールバックして再実行することを選択するため、電子メールを複数回送信することになります。
通常、電子メールを送信する必要がある行を定期的に検索し、電子メールを送信してから、テーブルを更新するデータベース ジョブを使用すると、はるかに優れたサービスが提供されます。古いDBMS_JOB
パッケージ、または新しいより洗練されたDBMS_SCHEDULER
パッケージのいずれかを使用できます。の線に沿った何か
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;
これは、たとえば 5 分ごとに実行されるようにスケジュールされています (DBMS_SCHEDULER
パッケージを使用することもできます) 。
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;
UTL_MAIL パッケージを使用して、プロシージャを実装できsend_email
ます。おそらく、適切なパラメーターを使用して呼び出す必要があるだけです(パラメーターを構成し、ユーザーにパッケージへの適切なアクセス権と、その SMTP サーバーとの通信を可能にする ACL へのアクセス権が付与されているとUTL_MAIL.SEND
仮定します)。SMTP_OUT_SERVER
UTL_MAIL