我正在尝试为before insert
编写触发器以验证案例日期。
案件日期应在当前日期之前的5年和之后的7年之间。
例如,在2018年,案件日期应为2013年至2025年。如果日期超出范围,则触发器应停止插入数据。
CREATE OR REPLACE TRIGGER ch
BEFORE INSERT
on CASE
FOR EACH ROW
DECLARE
CASN number;
BEGIN
SELECT COUNT(*)
INTO CASN
FROM CASE
WHERE :new.STARTDATE > SYSDATE;
IF (CASN > 0) THEN
RAISE_APPLICATION_ERROR(-20000,'Start DATE CANNOT Be GREATER than today's
date');
END IF;
END;
此处STARTDATE
是CASE
表
此触发器在开始日期大于今天的日期时启动,但我需要它在上面给出的范围之外运行。
如何向sysdate添加指定的间隔,以便它可以适用于上述条件?
答案 0 :(得分:3)
您在Trigger
中使用的逻辑是完全错误的。您不需要使用:NEW.STARTDATE
从表中获取计数。这是你正在寻找的东西。
CREATE OR replace TRIGGER ch
BEFORE INSERT ON cases
FOR EACH ROW
BEGIN
IF ( :NEW.casedate < SYSDATE - INTERVAL '5' year
OR :NEW.casedate > SYSDATE + INTERVAL '7' year ) THEN
RAISE_APPLICATION_ERROR(-20000,
'CASE DATE should be in range: current date - 5 years and current date + 7 years')
;
END IF;
END;
/
编辑:我没有在日期添加TRUNC
,因为我不确定您是否还要考虑时间组件,同时考虑日期范围。如果您没问题只考虑几天,您可以使用TRUNC(SYSDATE)
代替SYSDATE
。根据您的业务需求进行相应修改。
另一种选择是使用CHECK
约束。虽然Oracle不允许你拥有
在检查约束定义中使用SYSDATE
,您可以创建另一个列(或重用现有的),默认为SYSDATE
并对其应用检查约束。
ALTER TABLE CASES ADD ( CURR_DATE DATE DEFAULT SYSDATE );
ALTER TABLE CASES ADD CONSTRAINT
RANGE_CHECK CHECK( casedate > CURR_DATE - INTERVAL '5' YEAR
AND casedate < CURR_DATE + INTERVAL '7' YEAR) ENABLE;
答案 1 :(得分:-1)
日期算术。 Oracle数据库使您能够以多种方式对日期和时间戳执行算术运算:
在日期中添加数字值或从中减去它,如在SYSDATE + 7中; Oracle数据库将该数字视为天数。
在l_hiredate - SYSDATE中添加一个日期或从另一个日期中减去日期 使用内置函数将日期“移动”指定的月份或一周中的另一个日期。
以下是日期算术的一些示例,其中包含日期和数字(假设在所有情况下l_date变量都已声明为DATE):
where
当您向另一个添加一个日期或从中减去一个日期时,结果是两者之间的天数。结果,执行此块:
.
返回以下输出:
10 -10