2017-02-14 17 views
2

私は、UTL_MAILを使用して(/ ccに対して)特定のプロシージャの結果を送信する必要があるROUTINE、EMAILSおよびCOPIES列を持つテーブルEMAILSを持っています。PL/SQL例外処理のデータが見つかりません

私は、次のコードを持っている:私は電子メールがEMAILSテーブルにありませんときMYPROCがCODE1を実行したい

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; 

を。私の問題はNO_EMAIL_FOUND例外が発生せず、SELECT文の前にNO_DATA_FOUND例外が発生してからcode2が実行されたことです。これを避ける方法は?

答えて

0

このお試しください:なしTOO_MANY_ROWS(PROCの実行と1通のメール1つのレコード)が生じないよう

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を望むようにそれを伝播し、最終的に捕捉することです。 IF e.emailsがNULLの場合は、もう必要ありません。どうも。 – sbrbot

0

使用この:私はあなたがこのルーチンは、唯一のプロセスを正確に1つの電子メールができることを認識している願っています

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

列 'ルーチンは私EMAILSテーブルのPKです。もちろん、1つの電子メールが、より多くの電子メールアドレスを持っています。 – sbrbot

関連する問題