2016-05-08 21 views
0

これは私の手順です:私は、SQL * Plusを使用して、それを実行するとプロシージャで例外を発生させるには?

create or replace procedure p1(p_deptno in number) 
is 
    cursor c is select * from emp where deptno=p_deptno; 
    i emp%rowtype; 
begin 
    open c; 
    loop 
    fetch c into i; 
    exit when c%notfound; 
    dbms_output.put_line(i.ename); 
    end loop; 
exception 
    when no_data_found then 
    dbms_output.put_line('Give proper deptno'); 
end p1; 
/

、私はこれを取得:

SQL> execがP1(70)。

PL/SQL手続きが正常に完了しました。

しかし、デプトノ70は利用できません。例外は発生する必要がありますが、そうではありません。私は間違って何をしていますか?

+0

'raise'多分? https://docs.oracle.com/database/121/LNPLS/errors.htm#LNPLS00705 –

+0

実際には、プロシージャは機能し、例外をキャッチしてメッセージを書き込みます。 dbms_outputをアクティブ化しなかったためにメッセージが表示されない可能性があります。SET SERVEROUTPUT ONを入力してください。 – Nicola

答えて

1

あなたは(ドキュメントリンクhereRAISEを呼び出す必要が

IF i IS NULL THEN 
    RAISE no_data_found; 
END IF; 
+0

:PLS-00306: 'IS 'のコールで引数またはタイプが正しくありません。 ... iamがエラーを受け取りました –

+0

私はそれを逃しました。申し訳ありませんが、もう一度試してください – GavinCattell

+0

ありがとうございましたGavin Cattell –

1

データなしでは、あなたが選択(ないカーソル)を発射する場合にのみ、例外が発生するだろうが分かりました。続いてこれが起こるだろうどこコードに基づくサンプルです:

create or replace procedure p1(p_deptno in number) 
is 
    i emp%rowtype; 
begin 
    select * into i 
    from emp where deptno=p_deptno; 
exception 
    when no_data_found then 
    dbms_output.put_line('Give proper deptno'); 
end p1; 
/

ギャビンによって示されるように、あなたは、%NOTFOUNDに基づいて例外を発生させることができます。

また、オープンカーソルcursor_name%NOTFOUNDからの最初のフェッチではNULLが返されます。最後のフェッチが行を戻した場合はFALSEを戻し、最後のフェッチが行を戻しなかった場合はTRUEを戻します。 (https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems011.htm

+0

ありがとうdeepak vn –

2

RAISE_APPLICATION_ERRORを使用するこの特定のエラーメッセージに対してユーザー定義のエラーを表示する必要がある場合は、より適切になります。

CREATE OR REPLACE PROCEDURE p1(
    p_deptno IN NUMBER) 
IS 
    i emp%rowtype; 
BEGIN 
    SELECT * INTO i FROM emp WHERE deptno=p_deptno; 
EXCEPTION 
WHEN no_data_found THEN 
    RAISE_APPLICATION_ERROR(-20001,'Dept no '||p_deptno||' has no data',TRUE); 
END p1; 
+0

どのようにカーソルを使用して例外を処理するには? –

関連する問題