Oracle PL / SQL针对3个常量检查输入

时间:2019-02-27 15:41:59

标签: sql oracle plsql database-trigger

在插入或更新-软件,计算或业务之前,我需要检查变量(主题名称)并确保它是以下变量之一。

这是为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 :(得分:4)

您正在做的只是打印一条消息,该消息可能已配置也可能未配置为客户端。您不会阻止插入操作完成。

您可以提出一个例外:

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

...甚至在与具有有效主题列表的另一个表建立外键关系时甚至更好。