Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有关utl_mail.send()的例外情况_Sql_Oracle_Exception_Plsql_Utl Mail - Fatal编程技术网

Sql 有关utl_mail.send()的例外情况

Sql 有关utl_mail.send()的例外情况,sql,oracle,exception,plsql,utl-mail,Sql,Oracle,Exception,Plsql,Utl Mail,我正在使用utl_mail.send()发送电子邮件,通过我的光标发送的某些人可能没有电子邮件地址,或者有无效的电子邮件。我很难找出我可以使用哪些异常来确保我的过程在遇到这些空电子邮件时不会爆炸。例如: ..... procedure sendEmail --subroutine of my procedure BEGIN utl_mail.send(sender => email_from, r

我正在使用utl_mail.send()发送电子邮件,通过我的光标发送的某些人可能没有电子邮件地址,或者有无效的电子邮件。我很难找出我可以使用哪些异常来确保我的过程在遇到这些空电子邮件时不会爆炸。例如:

.....

procedure sendEmail                 --subroutine of my procedure
    BEGIN
        utl_mail.send(sender => email_from,
                  recipients => email_adr,
                  subject => email_subject,
                  mime_type => 'text/html',
                  message => email_body);

    --EXCEPTION SHOULD GO HERE

    END;


....
WHILE CURSOR%FOUND THEN
LOOP
    IF ..... THEN
        sendEmail;
    END IF;
....
END LOOP;

这可能会让人困惑,但如果有问题,请提问。谢谢您的帮助。

为什么要呼叫
UTL\u MAIL。如果
EMAIL\u ADR
为空,请发送
?为什么不在发送电子邮件之前检查一下电子邮件地址呢

BEGIN
  IF( email_adr IS NOT NULL )
  THEN
    utl_mail.send ...
  END IF;
END;
因为听起来你对任何特定的电子邮件由于任何原因而失败都没有意见,所以我很想捕获所有异常并将它们写入异常表,即

PROCEDURE send_email
AS
  l_error_code    NUMBER;
  l_error_message VARCHAR2(255);
BEGIN
  IF( is_valid_email( email_adr ) )
  THEN
    utl_mail.send ...
  END IF;
EXCEPTION
  WHEN others THEN
    l_error_code    := SQLCODE;
    l_error_message := SQLERRM;
    log_email_failure( email_from,
                       email_adr,
                       email_subject,
                       email_body,
                       l_error_code,
                       l_error_message );
END;

其中,
LOG\u EMAIL\u FAILURE
只是一种将故障写入某个日志表的日志记录方法,
is\u VALID\u EMAIL
是一种例行程序,用于检查电子邮件地址是否为空以及它是否有效(根据您希望的迂腐程度,存在大量正则表达式)。除非您要使代码更加复杂,以尝试区分(例如)暂时性SMTP错误和永久性SMTP错误,否则可能没有必要使用单独的异常处理程序。当然,还需要有人监视失败电子邮件表,以确保没有更系统性的问题(即SMTP服务器关闭)

好的,这可能是一个愚蠢的问题,但是使用上面的代码,在遇到无效的电子邮件地址后,我的过程会继续运行吗?我没有使用有效的电子邮件功能。我正在检查电子邮件是否为空,然后转到utl_mail.send,因此如果收到无效的电子邮件,我想点击我的异常,但随后继续我的过程。这有意义吗?@Jonathon-你说的“无效电子邮件地址”是什么意思?如果您指的是语法无效的地址(即缺少@),则SMTP服务器将拒绝该电子邮件,控制权将传递给
send_email
过程的异常处理程序,然后返回到调用PL/SQL块,用于循环的下一次迭代。如果您指的是无法发送但语法有效的电子邮件地址,SMTP服务器通常不会抛出异常,您可能会在数小时或数天后收到反弹。我指的是语法上的,一旦我有机会测试它,您似乎是对的。谢谢