oracle - 如何创建触发器,以便不能插入早于 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: 列列表对此触发器类型无效
解决方案
首先,不需要在触发器声明中指定列名,这里只是表名
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 被违反”。不自我解释,需要和额外的处理才能向用户发送明确的信息
希望这会有所帮助
推荐阅读
- html - 使用父 div 的全宽显示 2 个 div
- vuejs2 - 数组和对象问题 Vue
- react-native - react native tabview 给出错误 TypeError: undefined is not an object (evalating 'this')
- c# - 如何动态移动 PictureBlock 构建
- c# - System.IO.Compression.ZipArchive 在处理后保持文件锁定?
- date - 使用 sqoop 获取上一个日期
- php - Composer Curl 错误 60:SSL 证书问题:无法获取本地颁发者证书
- python - sympy 中求解结果的数值
- twincat - Twincat Xml 文件读写停止工作
- css - Flexbox 分组行