Geralmente, seria uma má ideia tentar enviar um e-mail em um gatilho.
- Se o sistema não puder enviar o e-mail (por exemplo, porque o servidor SMTP está temporariamente inativo), o acionador falhará e a instrução de acionamento falhará e será revertida. É muito raro que você realmente queira interromper a transação subjacente simplesmente porque não conseguiu enviar um e-mail.
- O envio de um e-mail não é transacional. Isso significa que você enviará e-mails para alterações que nunca serão confirmadas. E você enviará e-mails várias vezes porque a Oracle opta por reverter e reexecutar todo ou parte de um
INSERTdeclaração para manter a consistência de gravação.
Em geral, você será muito mais bem servido com um trabalho de banco de dados que procura periodicamente as linhas que precisam ter um email enviado, envia os emails e, em seguida, atualiza a tabela. Você pode usar o antigo
DBMS_JOB pacote ou o mais novo e mais sofisticado DBMS_SCHEDULER pacote. Algo na linha de 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;
que é programado para ser executado, digamos, a cada 5 minutos (você também pode usar o
DBMS_SCHEDULER pacote) 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;
Você pode usar o pacote UTL_MAIL para implementar o
send_email procedimento. Você provavelmente só precisa chamar UTL_MAIL.SEND com os parâmetros apropriados (assumindo que você configurou seu SMTP_OUT_SERVER parâmetro e seu usuário recebeu acesso apropriado ao UTL_MAIL pacote e para uma ACL que permite que você se comunique com esse servidor SMTP).