Oracle PL/SQL 根据 3 个常量检查输入
Oracle PL/SQL check an input against 3 constants
我需要检查一个变量(主题名称)并确保它在插入或更新之前是以下之一 - 软件、计算或业务。
这是一项 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;
您所做的只是打印一条消息,客户端可能被配置为可以看到也可能没有。您不会阻止插入完成。
您可以改为引发异常:
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
...甚至更好地与另一个具有有效主题列表的 table 建立外键关系。
我需要检查一个变量(主题名称)并确保它在插入或更新之前是以下之一 - 软件、计算或业务。
这是一项 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;
您所做的只是打印一条消息,客户端可能被配置为可以看到也可能没有。您不会阻止插入完成。
您可以改为引发异常:
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
...甚至更好地与另一个具有有效主题列表的 table 建立外键关系。