Вероятно, у вас есть проблемы с логическим приоритетом в ваших условиях, поскольку он содержит AND
s и OR
s без скобок. Кроме того, вы проверяете скалярные значения для подзапросов, которые возвращают более одной строки или более одного столбца, это приведет к ошибкам во время выполнения.
Но в целом, я думаю, что ваш код можно упростить с помощью уникального 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;
/
Примечание: неясно, какова цель colum :new.guest_no
, поэтому я оставил это отдельно от времени (я предполагал, что вы имели в виду :new.student_no
вместо).