2017-12-10 17 views
0

すべてのフィールドをチェックしても問題ありませんが、このエラーが発生する SQLコマンドでこのトリガを記述すると、トリガが作成されたと表示されますが、 無効これは、ここに私のトリガーOracle PL/SQL不良バインド変数

create or replace trigger "Max_Crew_T1" 
    Before insert or update on "CREW" 
    for each row 
declare 
    v_count number; 
Begin 
    select count(*) into v_count from CREW where AirPlaneID=:NEW.AirPlaneID; 
    if 
     v_count > 5 
    then 
     Raise_Application_ERROR(-20343,'Crew number exceeded'); 
    END IF; 
END; 

あるエラーメッセージです。引用符でテーブルを作成中に飛行機のIDを定義しているため

PLS-00049: bad bind variable 'NEW.AIRPLANEID' 

テーブルDESC

enter image description here

+0

をあなたは 'ショーのエラーを追加することができます;'最後に、実際のエラーがあるかを確認します。 – gvenzl

+0

@gvenzl私の質問に間違っている編集しました –

+0

トリガーには別の問題があります。トリガーをトリガーした同じテーブルにアクセスすべきではありません。 一度にレコードを1つだけ挿入するとうまくいくので、すでに変更される前にテーブルにアクセスしています(選択カウント(*))。しかし、技術的には同じステートメント( "insert ... select"ステートメントを使用)。この場合、トリガーは最初の行に対してのみ正しく実行されますが、同じステートメントの2番目の行に対してトリガーされると、「テーブルが突然変異しています」というエラーが発生します。私はあなたに「化合物トリガー」について読むことをお勧めします。 –

答えて

1

については、以下のリンクをクリックエラーです。私は "AirPlaneID"したがってトリガーで同じことをする必要があります。

大文字と小文字を区別する列を引用符で囲んで定義することは、これらの問題を引き起こすため、引用符を付けずにはるかによく定義することをお勧めします。テーブルクルー(飛行機番号(6))を作成します。とにかく..

以下使用してください:

create or replace trigger "Max_Crew_T1" 
    Before insert or update on "CREW" 
    for each row 
declare 
    v_count number; 
Begin 
    select count(*) into v_count from CREW where "AirPlaneID"=:NEW."AirPlaneID"; 
    if 
     v_count > 5 
    then 
     Raise_Application_ERROR(-20343,'Crew number exceeded'); 
    END IF; 
END; 
関連する問題