首页 > 解决方案 > 如何创建触发器,以便不能插入早于 2017 年和晚于 2019 年的日期

问题描述

Create or replace Trigger in_vehicle
Before Insert of PURCHASE_DATE On Vehicle 
for each row
Begin
IF(:new.PURCHASE_DATE < '12/31/2016')
THEN
raise_application_error(20001, 'the Hire date must be between 2017 and 2020');
end if 
if(:new.PURCHASE_DATE > '12/31/2016') and  (:new.PURCHASE_DATE > '01/01/2020')
then raise_application_error(20001, 'the Hire date must be between 2017 and 2020');
end if;
end;

ORA-04073: 列列表对此触发器类型无效

标签: oracleplsqloracle-apexdatabase-trigger

解决方案


首先,不需要在触发器声明中指定列名,这里只是表名

Before insert on table_name

其次,Ifs 对我来说似乎是多余的,我只会说“小于或大于”。

第三,异常数总是(据我所知)为负数。在您的情况下为“-20001”。这是您可能需要的触发器示例

CREATE OR REPLACE Trigger in_vehicle
Before Insert On qq
for each row
Begin
  IF(:new.PURCHASE_DATE < to_date('12/31/2016', 'mm/dd/yyyy')) or (:new.PURCHASE_DATE > to_date('01/01/2020', 'mm/dd/yyyy')) THEN
    raise_application_error(-20001, 'the Hire date must be between 2017 and 2020');
  end if;
end;

另一方面,这种限制可以通过对表使用检查约束以更简单的方式实现。像这样

alter table your_table add constraint purchase_date_2017_2019 check (purchase_date between to_date('01.01.2017', 'dd.mm.yyyy') and to_date('31.12.2019', 'dd.mm.yyyy'));   

这里的缺点是异常看起来像“约束 purchase_date_2017_2019 被违反”。不自我解释,需要和额外的处理才能向用户发送明确的信息

希望这会有所帮助


推荐阅读