私は次のテーブルを持っています:
FACULTYテーブル
CREATE TABLE "FACULTY"
( "FACULTY_ID" NUMBER(3,0),
"FACULTY_NAME" VARCHAR2(30),
"FACULTY_DEAN" VARCHAR2(30),
CONSTRAINT "FACULTY_PK" PRIMARY KEY ("FACULTY_ID") ENABLE
)
コーステーブル
CREATE TABLE "COURSE"
( "COURSE_ID" NUMBER(5,0),
"COURSE_NAME" VARCHAR2(50),
"COURSE_LEVEL" NUMBER,
"FACULTY" NUMBER,
CONSTRAINT "COURSE_PK" PRIMARY KEY ("COURSE_ID") ENABLE
)
だから今私は2つのことを達成したい
(1)faculty_idがfacultyテーブルで更新されたとき。トリガーが起動し、コーステーブルの対応する行が新しい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」の2行目ORA-04088:トリガー「SYSTEM.UPDATE_FACULTY」の実行中にエラーが発生しました
それを解決する方法について何かアイデアはありますか?
(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:「SYSTEM.UPDATE_COURSE_ID」の5行目ORA-04088:トリガー「SYSTEM.UPDATE_COURSE_ID」の実行中にエラーが発生しました