Все, что вы делаете, это печатаете сообщение, которое клиент может или не может быть настроен для просмотра.Вы не мешаете вставке завершить.
Вместо этого вы можете вызвать исключение:
create or replace trigger subject_name_check
before insert or update on Student
FOR EACH ROW
WHEN (NEW.SUBJECT NOT IN ('Software', 'Computing', 'Business'))
begin
RAISE_APPLICATION_ERROR(-20001, 'INVALID INPUT');
end;
Я также исправил логику сравнения - вы не можете сравнивать одно с несколькими другими вкак вы пытались.
Быстрое демо:
create table student (subject varchar2(20));
create or replace trigger subject_name_check
before insert or update on Student
FOR EACH ROW
WHEN (NEW.SUBJECT NOT IN ('Software', 'Computing', 'Business'))
begin
RAISE_APPLICATION_ERROR(-20001, 'INVALID INPUT');
end;
/
insert into student (subject) values ('Software');
1 row inserted.
insert into student (subject) values ('Spanish');
ORA-20001: INVALID INPUT
ORA-06512: at "MYSCHEMA.SUBJECT_NAME_CHECK", line 2
Но это действительно должно быть сделано с проверочным ограничением, а не с триггером:
drop trigger subject_name_check;
alter table student add (
constraint subject_name_check check (
subject in ('Software', 'Computing', 'Business'))
);
insert into student (subject) values ('Computing');
1 row inserted.
insert into student (subject) values ('Physics');
ORA-02290: check constraint (MYSCHEMA.SUBJECT_NAME_CHECK) violated
... или, что еще лучше, с отношением внешнего ключа к другой таблице с действительным списком субъектов.