2016-05-03 5 views
0
に多分

をロールバックは、私は、次のトリガーがあるとします。Oracleのトリガーの例外と

create or replace trigger trigInsertSaloane before insert on saloane 
for each row 
declare 
    myExcp exception; 
    pragma exception_init (myExcp,-20005); 
begin 
    for i in (select * from saloane) loop 
    if(:new.numar_salon=i.numar_salon) and (trim(upper(:new.nume_sectie))=trim(upper(i.nume_sectie))) then 
    raise myExcp; 
    end if; 
    end loop; 
    exception when myExcp then dbms_output.put_line('Record exists'); 
end; 
/

私が欲しいのは、例外が発生した場合行を挿入しないことですので、ロールバックのようなもの。私の場合、例外が発生し捕まえられた場合、その行も挿入されます。私はそれを望んでいない。また、私はメッセージを表示してエラーを出さないように、かなりの方法でそれを作りたいと思っています。

答えて

0

ok ..いくつかの点。

1)挿入の失敗と挿入されないように、トリガーから例外を発生させる必要があります。だからあなたの例外をキャッチしないか、もう一度RAISEをもう一度やり直してください。

2)dbms_output.put_line()を使用すると、ユーザー/クライアントの電源がオンの場合にのみメッセージが表示されます。

3)カーソルをループオーバーする必要はありません。 where節を追加すると効率が向上します

4)トリガーは機能しません。一度に1つ以上の行を挿入すると、 ORA-04091: table SALOANE is mutating, trigger/function may not see itがスローされます。 (試してinsert into saloane select * from saloane

5)それはちょうどあなたの例である可能性があります。より簡単にこの要件を実施するために、特定の列に一意の制約を使用することができます。

0

他の回答にも触れているように、いくつかのポイントを追加してください。

  1. あなたは(かなりよく:P)例外処理されているので、とても理想的 トリガーでのトリガイベントの実行が成功したので、 INSERT/UPDATE/DELETE起こります。
  2. は、ここで必要となるあなたが、このRAISE_APPLICATION_ERROR条件に のハンドルを持っている必要があり、この中で例外そう で失敗に トリガーを強制する例外のいくつかの種類を高めることです。
  3. 上記のように、ユニークなキー制約はこの場合の の親友になります。
関連する問題