Oracle 如何创建触发器以便';t插入日期早于2017年,晚于2019年 在车辆中创建或更换触发器 在车辆上插入购买日期之前 每行 开始 如果(:new.PURCHASE_DATE'12/31/2016')和(:new.PURCHASE\u DATE>'01/01/2020') 然后提出申请错误(20001,“聘用日期必须在2017年至2020年之间”); 如果结束; 结束;

Oracle 如何创建触发器以便';t插入日期早于2017年,晚于2019年 在车辆中创建或更换触发器 在车辆上插入购买日期之前 每行 开始 如果(:new.PURCHASE_DATE'12/31/2016')和(:new.PURCHASE\u DATE>'01/01/2020') 然后提出申请错误(20001,“聘用日期必须在2017年至2020年之间”); 如果结束; 结束;,oracle,plsql,oracle-apex,database-trigger,Oracle,Plsql,Oracle Apex,Database Trigger,ORA-04073:列列表对此触发器类型无效插入触发器之前(和之后)不采用列列表(就像更新触发器之前和之后),因为您总是插入整行,而不管其中是否有任何列为null 只需删除的子句,您就可以: 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_app

ORA-04073:列列表对此触发器类型无效插入触发器之前(和之后)不采用列列表(就像更新触发器之前和之后),因为您总是插入整行,而不管其中是否有任何列为
null

只需删除的
子句,您就可以:

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;

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

Create or replace Trigger in_vehicle
Before Insert On Vehicle -- Of clause removed
for each row
-- etc...
第二,如果对我来说似乎是多余的,我只会说“小于或大于”

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

Before insert on table_name
这里的缺点是异常情况看起来像“约束购买日期2017 2019”。不自解释,需要额外的处理才能向用户发送清晰的消息

希望这将有助于此触发器工作。(

在车辆中创建或更换触发器
在qq上插入之前
每行
开始
如果(:new.PURCHASE\u DATE<截止日期('2016年12月31日,'mm/dd/yyyy'))或(:new.PURCHASE\u DATE>截止日期('2020年1月1日,'mm/dd/yyyy')),则
提出申请错误(-20001,“聘用日期必须在2017年至2020年之间”);
如果结束;
结束;

首先,我看不出您为什么要使用
触发器进行日期验证?如果您是从
oracle apex
页面项目
(请原谅,您已经将
oracle apex
添加为
标记
),那么您只需创建一个
日期字段/项目
,并提供
最小日期
最大日期
值即可。它将限制用户选择给定日期时间段内的日期。您也可以在
oracle apex
中创建
validation


另一件事是,您的代码有很多错误,比如您将日期字段与字符串进行比较,请尝试使用
to_date()
。Error函数必须抛出一个负数,如
-20001

如果将
日期
值与字符串进行比较,请不要这样做。使用日期文字
DATE'2016-12-31'
或函数
到日期('12/31/2016','MM/DD/YYYY')
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'));   
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;