我正在尝试创建一个有问题的触发器。触发器的工作是阻止该项目插入。这里有2张学生和科目表。我必须检查并防止在该学生尚未注册该科目时插入,如果有,他将在下个学期开始学习,因此目前他还没有注册。请帮助我。
CREATE OR REPLACE TRIGGER check_student
BEFORE INSERT ON subject
FOR EACH ROW
BEGIN
IF :new.student_no and :new.student_name NOT IN (SELECT DISTINCT student_no,student_name from student)
or
:new.student_enrollment_date < (select min(enrolment_date) from student where student.student_name = :new.student_name and student.student_no = :new.guest_no group by student.student_name , student.student_no)
and :new.student_name = (select distinct student_name from student)
and :new.student_no = (select distinct student_no from student)
THEN
raise_application_error(-20000, 'Person must have lived there');
END IF;
END;
/
我必须检查并防止在学生尚未报名该科目时插入,如果有,他将从下一个学期开始,所以目前他还没有报名。请帮助我。
您在您的情况下可能有逻辑上的先决问题,因为它包含AND
和OR
,没有任何括号。
但是总的来说,我认为可以通过对子查询使用唯一的NOT EXISTS
条件来简化代码,该子查询可以一次检查是否满足所有功能条件。这应该非常接近您想要的内容:
create or replace trigger check_student
before insert on subject
for each row
begin
if not exists (
select 1
from student
where
name = :new.student_name
and student_no = :new.student_no
and enrolment_date <= :new.student_enrollment_date
) then
raise_application_error(-20000, 'Person must have livd there');
end if;
end;
/
注意:目前尚不清楚:new.guest_no
的用途,所以我暂时将其保留下来(我假设您的意思是:new.student_no
。]]