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 常量作为参数传递?

oracle--pl/sql变量定义----

PL/SQL 正则表达式检查

过程检查设置参数(PL/SQL、ORACLE)

Oracle 11 PL/SQL:检查变量是不是为空、空字符串和无结果

Oracle PL/SQL - 在过程中使用约束声明常量