Oracle PL/SQL 根据 3 个常量检查输入
Posted
技术标签:
【中文标题】Oracle PL/SQL 根据 3 个常量检查输入【英文标题】:Oracle PL/SQL check an input against 3 constants 【发布时间】:2019-02-27 15:41:59 【问题描述】:在插入或更新之前,我需要检查一个变量(主题名称)并确保它是以下之一 - 软件、计算或业务。
这是一篇 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】:您所做的只是打印一条消息,客户端可能会或可能不会配置为查看该消息。您并没有阻止插入完成。
您可以改为引发异常:
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
... 甚至更好的外键关系到另一个具有有效主题列表的表。
【讨论】:
我一直不明白为什么讲师会选择这样完全不切实际的例子来教授触发器...... 好吧,至少 OP 已经认识到它们很糟糕 *8-) 我想他们还在教旧的连接语法以上是关于Oracle PL/SQL 根据 3 个常量检查输入的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jOOQ 将 Oracle PL/SQL 常量作为参数传递?