Oracle PL / SQL проверяет вход на 3 константы - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно проверить переменную (имя субъекта) и убедиться, что перед вставкой или обновлением она имеет значение 1 из следующих: - Программное обеспечение, Компьютеры или Бизнес.

Это для части работы Uni ипреподаватели ужасны, поэтому любая помощь будет оценена.

У меня есть следующий код, но он не работает.

create or replace trigger subject_name_check
  before insert or update on Student
  FOR EACH ROW
  WHEN (NEW.SUBJECT <> 'Software' or 'Computing' or 'Business')
begin
  DBMS_OUTPUT.PUT_LINE('INVALID INPUT');
end;

1 Ответ

0 голосов
/ 27 февраля 2019

Все, что вы делаете, это печатаете сообщение, которое клиент может или не может быть настроен для просмотра.Вы не мешаете вставке завершить.

Вместо этого вы можете вызвать исключение:

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

... или, что еще лучше, с отношением внешнего ключа к другой таблице с действительным списком субъектов.

...