创建pl sql触发器

时间:2018-04-08 05:22:23

标签: oracle plsql

我正在尝试为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;

此处STARTDATECASE

的列

此触发器在开始日期大于今天的日期时启动,但我需要它在上面给出的范围之外运行。

如何向sysdate添加指定的间隔,以便它可以适用于上述条件?

2 个答案:

答案 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