2017-02-14 68 views
2

我有一个表EMAILS与列:例程,电子邮件和副本定义谁应使用UTL_MAIL发送特定过程的结果(至/ cc)。PL/SQL没有发现数据异常处理

我有以下代码:

PROCEDURE myproc AS 
    NO_EMAIL_FOUND EXCEPTION; 
    e EMAILS%ROWTYPE; 
    x NUMBER; 
BEGIN 

    --fetch data 
    SELECT x INTO x FROM <...>; 

    --fetch emails 
    SELECT * INTO e FROM emails WHERE routine='FRS_WEEKLY'; 
    IF e.emails IS NULL AND e.copies IS NULL THEN 
    RAISE NO_EMAIL_FOUND; 
    END IF; 

    <send mail code using UTL_MAIL>; 

    EXCEPTION 
    WHEN NO_EMAIL_FOUND THEN <code1>; 
    WHEN NO_DATA_FOUND THEN <code2>; 
    WHEN OTHERS THEN NULL; --RAISE; 

END myproc; 

我想myproc的执行代码1时,有在电子邮件表中没有电子邮件。我的问题是NO_EMAIL_FOUND异常不会引发,因为NO_DATA_FOUND异常在SELECT语句之前被引发,所以执行code2。如何避免这种情况?

回答

0

试试这个:

PROCEDURE myproc AS 
    NO_EMAIL_FOUND EXCEPTION; 
    e EMAILS%ROWTYPE; 
    x NUMBER; 
BEGIN 

    BEGIN 
     --fetch data 
     SELECT x INTO x FROM <...>; 

     --fetch emails 
     BEGIN 
      SELECT * INTO e FROM emails WHERE routine='FRS_WEEKLY'; 
     EXCEPTION WHEN NO_DATA_FOUND THEN 
      RAISE NO_EMAIL_FOUND; 
     END; 
     IF e.emails IS NULL AND e.copies IS NULL THEN 
      RAISE NO_EMAIL_FOUND; 
     END IF; 

     <send mail code using UTL_MAIL>; 

    EXCEPTION 
     WHEN NO_EMAIL_FOUND THEN <code1>; 
     WHEN NO_DATA_FOUND THEN <code2>; 
     WHEN OTHERS THEN NULL; --RAISE; 
    END; 

END myproc; 
+1

Yap,解决方法是将我的SELECT放入内部的BEGIN EXCEPTION END结构中,在内部捕获NO_DATA_FOUND,并将其传播为想要的NO_EMAIL_FOUND,最后抓住它。如果e.emails IS NULL ...则不再需要。谢谢。 – sbrbot

0

使用此:

PROCEDURE myproc AS 
    NO_EMAIL_FOUND EXCEPTION; 
    e EMAILS%ROWTYPE; 
    x NUMBER; 
BEGIN 

    --fetch data 
    SELECT x INTO x FROM <...>; 

    --fetch emails 
    BEGIN 
    SELECT * INTO e FROM emails WHERE routine='FRS_WEEKLY'; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     RAISE NO_EMAIL_FOUND; 
    END; 

    IF e.emails IS NULL AND e.copies IS NULL THEN 
    RAISE NO_EMAIL_FOUND; 
    END IF; 

    <send mail code using UTL_MAIL>; 

    EXCEPTION 
    WHEN NO_EMAIL_FOUND THEN <code1>; 
    WHEN NO_DATA_FOUND THEN <code2>; 
    WHEN OTHERS THEN NULL; --RAISE; 

END myproc; 

我希望大家都知道,这个程序只能处理只有一个电子邮件;如果有多个,则会引发TOO_MANY_ROWS异常。

+0

列“常规”是PK在我的邮件表,所以不会有TOO_MANY_ROWS(每PROC执行一个记录,一个邮件)。当然,只有一封电子邮件,但电子邮件地址更多。 – sbrbot