代码之家  ›  专栏  ›  技术社区  ›  raju

创建pl sql触发器

  •  1
  • raju  · 技术社区  · 8 年前

    我想写一个触发器 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添加指定的间隔,以便它可以在上述条件下工作?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Kaushik Nayak    8 年前

    您在 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不允许您 使用 系统日期 在检查约束定义中,可以创建另一列(或重用现有列),默认为 系统日期 并对其应用检查约束。

    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;
    
        2
  •  -1
  •   Anuj Arora    8 年前

    日期算术。Oracle数据库使您能够以多种方式对日期和时间戳执行算术运算:

    在日期上加一个数值或从中减去一个数值,如SYSDATE+7;Oracle数据库将该数字视为天数。

    将一个日期添加到另一个日期或从另一个日期中减去它,如l\u hiredate-SYSDATE。
    使用内置函数将日期移动指定的月数或一周内的其他日期。

    以下是一些带有日期和数字的日期算术示例(假设在所有情况下,l\U date变量都已声明为date):

    Set a local variable to tomorrow’s date: 
    
    
    
    l_date := SYSDATE + 1;
    
    
    Move back one hour:
    
    
    
    l_date := SYSDATE - 1/24;
    
    
    Move ahead 10 seconds:
    
    
    
    l_date := SYSDATE + 10 / (60 * 60 * 24);
    

    当您将一个日期与另一个日期相加或相减时,结果是两个日期之间的天数。因此,执行此块:

        DECLARE
           l_date1   DATE := SYSDATE;
           l_date2   DATE := SYSDATE + 10;
        BEGIN
           DBMS_OUTPUT.put_line (
              l_date2 - l_date1);
           DBMS_OUTPUT.put_line (
              l_date1 - l_date2);
        END;
    

    返回以下输出:

    10 -10个