2012-05-08 6 views
0

をトリガー2つのことを達成するためにオラクルは、私は以下の表を持って、エラーORA-01427&エラーORA-04091

(1)faculty_idが教職員テーブルで更新されたとき。トリガーは発火し、コーステーブルの対応する行を新しいfaculty_idで更新します。また、古いfaculty_id値、コース名、および操作が実行された日付をcourse_logテーブルに格納します。以下は

私は

create or replace trigger update_faculty 
after update on faculty 
for each row 
begin 
    insert into course_log 
    values (:old.faculty_id, 
      (select course_name 
       from course 
       where faculty=:old.faculty_id), 
      sysdate); 
    update course 
     set faculty=:new.faculty_id 
    where faculty=:old.faculty_id; 
end; 

得たものである。しかし、私は次のエラーを取得します。

エラーORA-01427:単一行のサブクエリは、複数の行ORA-06512を返し 'SYSTEM.UPDATE_FACULTY'

トリガーの実行中にエラー: "SYSTEM.UPDATE_FACULTY"、ライン2 ORA-04088で

解決方法に関するアイデアはありますか?

(2)コーステーブルのcourse_id属性を変更すると起動するトリガーを作成します。これにより、値が既にコーステーブルに存在するかどうかがチェックされ、新しい値であれば正常に更新されます。値がすでにどの行にも存在する場合、トリガーは「course_idは既に存在します!更新に失敗しました」というアプリケーションエラーをスローします。以下

は私のクエリ

CREATE OR REPLACE TRIGGER "UPDATE_COURSE_ID" 
after update on course 
for each row 
declare 
    error number; 
begin 
    select count(*) 
     into error 
    from course 
    where course_id=:new.course_id; 

    if error > 0 then 
     raise_application_error (-20000,'The course_id already found! Update not success'); 
    end if; 
    if error = 0 then 
     update course set course_id=:new.course_id where course_id=:old.course_id; 
    end if; 
end; 

あるしかし、私はこのエラーを得た

エラーORA-04091:表のSYSTEM.COURSEが変異され、トリガー/関数はそれにORA-06512が表示されない場合がありますでORA-04088:トリガ 'SYSTEM.UPDATE_COURSE_ID'の実行中にエラーが発生しました。

+0

この宿題はありますか? –

+0

それは私がトリガーで練習するために得たいくつかの練習です。あなたは助けることができますか? – user1382242

答えて

0

最初の質問では、複数の行course_logテーブルに、あなたは2番目の質問について

create or replace trigger update_faculty 
    after update on faculty 
    for each row 
begin 
    -- I'm guessing about the definition of the course_log table 
    insert into course_log(faculty_id, course_name, log_date) 
    select :old.faculty_id, course_name, sysdate 
     from course 
     where faculty=:old.faculty_id; 

    update course 
     set faculty=:new.faculty_id 
    where faculty=:old.faculty_id; 
end; 

ような何かをする必要があると思い、それがトリガーを使用しても意味がありません。あなたは制約を使いたいでしょう。すでにcourse_idのプライマリ・キー制約がcourseにあり、既に重複しているcourse_idの値を防止しています。

トリガーを使用してこのようなことを強制することは、実際には貧弱です。 courseの行レベルトリガーは、courseテーブルを照会できません(挿入ステートメントが常に単一行形式のINSERT ... VALUESであるか、自律型トランザクションを使用するトリガーであれば行レベルの挿入トリガーは例外ですが、ここではどちらも該当しません) 。したがって、実際にトリガーでこれを行う場合は、course_id値のコレクション、コレクションを初期化するbeforeステートメントトリガー、コレクションに:new.course_idを追加する行レベルトリガー、およびコレクションに対して反復処理を行い、重複しているcourse_idの値を探すafter文トリガー。これは、最初にトリガーで行うべきではなく、あなたの制約によってすでに行われていることを行うための多くのオブジェクトです。トリガーについて学んでいるだけの方は、パッケージやコレクションについてまだ教えられていないと思っていますが、その解決策はそれほど適切ではありません。

関連する問題