2013-02-04 6 views
16

ビーイングPL/SQLでまだ初心者、私は次のトリガー周りをコピー&ペーストしてきた:「それ以外の人は何かをする時に例外がありますか?

CREATE OR REPLACE TRIGGER FOO_TRG1 
    BEFORE INSERT 
    ON FOO 
    REFERENCING NEW AS NEW OLD AS OLD 
    FOR EACH ROW 
BEGIN 
    IF :NEW.FOO_ID IS NULL THEN 
     SELECT FOO_SEQ1.NEXTVAL INTO :NEW.FOO_ID FROM DUAL; 
    END IF; 

    EXCEPTION 
     WHEN OTHERS THEN RAISE; 
END FOO_TRG1; 
/
ALTER TRIGGER FOO_TRG1 ENABLE; 

私は付属の例外処理コードは、I以来、まったく何もしないし、単に削除されますことができることを疑います何かがうまくいかないとエラーメッセージが表示されます。私は正しい?

(私はそのようなコードは、さらに編集前のコードの結果であると思います。)

答えて

28

はい、その例外では何もしませんが、同じエラーを上げます。エラーの実行番号をマスクする役割も果たします。もし私があなただったら私はそれを取り除くだろう。

例:

SQL> declare 
    2 v number; 
    3 begin 
    4 select 1 into v from dual; 
    5 select 'a' into v from dual; 
    6 exception 
    7 when others 
    8 then 
    9  raise; 
10 end; 
11/
declare 
* 
ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at line 9 

VS:

SQL> declare 
    2 v number; 
    3 begin 
    4 select 1 into v from dual; 
    5 select 'a' into v from dual; 
    6 end; 
    7/
declare 
* 
ERROR at line 1: 
ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at line 5 

最初の1の行番号が昇給の代わりに、実際の行番号を指しています。エラーをより詳細に追跡することができます。

0

それはまったく何もしないだけでなく、犯罪者にも関係しています。それは基本的に「楽しいよ、私はエラーが実際のラインではなくこのラインで起こったと思っている」と言います。

例外処理は、言語全体で最も誤解を招く側面です。上記は非常に一般的なもので、「未処理の例外」が悪いという基本的な誤解から生まれたものだと思います。 Oracleが「例外が発生しました」または「例外が発生しました」という用語を使用していた場合、このコードをサポートしなければならない貧しい人々は、「その他の例外を処理する例外ハンドラ」が私たちの生活を悲惨にします。

関連する問題