2017-11-16 36 views
0

私のoracle PL/SQLプログラムでDIVIDE_BY_ZERO例外を生成しようとしています。私は関数を使用していますが、私は私のプログラムを実行するとき、私は以下に示すエラーが発生しています。私のプログラムで何が間違っているか教えてもらえますか?関数内のPL/SQL例外処理

コード:

CREATE OR REPLACE 
PACKAGE CALCULATOR AS 

    FUNCTION AddNumber(addend IN Number, Addend2 IN Number) RETURN NUMBER; 
    FUNCTION DivNumber(divend IN Number, divend2 IN Number) RETURN NUMBER; 

END CALCULATOR; 
/

CREATE OR REPLACE 
PACKAGE BODY CALCULATOR AS 

    FUNCTION AddNumber(addend IN Number, Addend2 IN Number) RETURN NUMBER AS 
    BEGIN 
    return addend + addend2; 

    END AddNumber; 

    FUNCTION DivNumber(divend IN Number, divend2 IN Number) RETURN NUMBER AS 
    BEGIN 
     return divend/divend2; 
     EXCEPTION 
     WHEN ZERO_DIVIDE THEN 
     NULL;  
    END DivNumber; 

END CALCULATOR; 
/

select calculator.AddNumber(3,4) from dual; 
select calculator.DivNumber(12,0) from dual; 

が出力:

enter image description here

+0

ような例外に対処することができます。それを修正する方法は別の問題です。それは "仕様"(関数がゼロで除算されたときに何をしたいか)に依存します。何が問題なのですか?ゼロ除算の場合、EXCEPTIONブロックに入ります(実行はRETURNコマンドには届きません)。また、EXCEPTIONブロックにはRETURNステートメントがありません。関数はRETURN文を持たないことは許されません。これは、エラーメッセージに表示される内容です。 – mathguy

答えて

1

あなたは何が間違っていることは簡単であなたを占いこの

FUNCTION DivNumber(divend IN Number, divend2 IN Number) RETURN NUMBER AS 
e_ZERO_DIVIDE EXCEPTION; 
BEGIN 
-- the condition 
    IF divend2 = 0 THEN 
    Raise e_ZERO_DIVIDE; 
    END IF; 
return divend/divend2; 
--Exception handling 
EXCEPTION 
WHEN e_ZERO_DIVIDE THEN 
    dbms_output.put_line('Division by 0 or null'); 
    RETURN 1; 
WHEN OTHERS THEN 
    dbms_output.put_line('ERROR: '||sqlerrm); 
    RETURN 1; 
END DivNumber; 
+0

このプログラムは動作しますが、ユーザーが0で割ると、メッセージは "0で除算するか、nullで表示"する必要があります。 output.put_lineを使用しましたが、メッセージが表示されていませんか? – Riya

+0

あなたはurサーバ出力をonに設定する必要があります – aljassi

0

IMOあなたが避け例外をスローするコードを書くべきではありません。例外が発生することは避けられない場合もありますが、この場合は可能です。次のように関数を書き換えることをお勧めします。

FUNCTION DivNumber(numerator IN Number, denominator IN Number) RETURN NUMBER AS 
BEGIN 
    IF NVL(denominator, 0) <> 0 THEN 
    return numerator/denominator; 
    ELSE 
    RETURN NULL; 
    END IF; 
END DivNumber; 

最高の運があります。

+0

私の質問に答えていただきありがとうございますが、私はこのエラーが発生しています:**エラー(6,10):PLS-00323:サブプログラムまたはカーソル 'DIVNUMBER'はパッケージ仕様で宣言されており、パッケージで定義する必要があります本文** – Riya

+1

「回避可能な例外をスローするコードを書かないでください」という理由を詳しく説明できますか?それは私には意味をなさない。この場合、0による除算が試みられたという事実を発信者に警告することが理にかなっています。これは、2つの入力番号の一方(または両方)がNULLであることとは非常に異なります。数値のいずれかがNULLの場合、関数WOULDはNULLを返します。ゼロと除算を区別したくないですか?そうでない場合は、どうしてですか? – mathguy

+0

パッケージボディにのみ機能を追加しましたが。 – Riya