【问题标题】:PL/SQL Creating a trigger that checks SYSDATE against a range of datePL/SQL 创建一个根据日期范围检查 SYSDATE 的触发器
【发布时间】:2019-06-02 19:44:03
【问题描述】:

创建一个触发器,在每年 1 月 1 日之后的一周内阻止 Table 的更新。

我尝试将 01 jan 的值作为 0101 的字符,并尝试添加 7 天但无济于事。有没有办法做到这一点?

BEFORE UPDATE ON employee
FOR EACH ROW
DECLARE
  first_jan date;
BEGIN
   first_jan := to_date('0101','DDMM');
   IF(SYSDATE < first_jan+7) THEN 
      RAISE_APPLICATION_ERROR(-20004,'Error Message');
END IF;
END;

【问题讨论】:

    标签: sql oracle plsql sqlplus


    【解决方案1】:

    按照你的意愿去做?

    BEFORE UPDATE ON employee
    FOR EACH ROW
    BEGIN
       first_jan := to_date('0101','DDMM');
       IF (extract(month from SYSDATE) = 1 and
           extract(day from sysdate) <= 7
          ) THEN 
          RAISE_APPLICATION_ERROR(-20004,'Error Message');
        END IF;
    END;
    

    【讨论】:

    • 谢谢!这确实可以满足我的要求,但我想知道是否还有其他方法
    • @Anthony 。 . .我不知道你指的是什么。这回答了你的问题。
    【解决方案2】:

    另一种方法是:

    CREATE OR REPLACE TRIGGER EMPLOYEE_BU
    BEFORE UPDATE ON employee
    FOR EACH ROW
    BEGIN
      IF TO_NUMBER(TO_CHAR(SYSDATE, 'MMDD')) <= 107 THEN
        RAISE_APPLICATION_ERROR(-20004,'Error Message');
      END IF;
    END EMPLOYEE_BU;
    

    另一种选择是:

    CREATE OR REPLACE TRIGGER EMPLOYEE_BU
    BEFORE UPDATE ON employee
    FOR EACH ROW
    BEGIN
      IF TO_NUMBER(TO_CHAR(SYSDATE, 'WW')) = 1 THEN
        RAISE_APPLICATION_ERROR(-20004,'Error Message');
      END IF;
    END EMPLOYEE_BU;
    

    而 YAA(另一种选择)是:

    CREATE OR REPLACE TRIGGER EMPLOYEE_BU
    BEFORE UPDATE ON employee
    FOR EACH ROW
    BEGIN
      IF TO_NUMBER(TO_CHAR(SYSDATE, 'MMW')) = 11 THEN
        RAISE_APPLICATION_ERROR(-20004,'Error Message');
      END IF;
    END EMPLOYEE_BU;
    

    dbfiddle here

    【讨论】:

      【解决方案3】:

      DDD 是一年中的某一天。

      SQL> select date '2019-01-03' from dual;
      
      DATE'2019
      ---------
      03-JAN-19
      
      SQL> select to_char(date '2019-01-03','ddd') from dual;
      
      TO_
      ---
      003
      
      SQL> select to_char(date '2019-02-03','ddd') from dual;
      
      TO_
      ---
      034
      

      这是一个可以插入 IF 语句的单行符

      【讨论】:

        【解决方案4】:

        1 月 1 日的日期可通过将 sysdate 截断为年份来获得:“trunc(sysdate,'yyyy')”。因此,在这种情况下,您无需额外的变量和

        的单个函数调用即可获得所需的结果
        if sysdate < trunc(sysdate,'yyyy')+7 
        then 
            raise application_error(-20004, 'error message'); 
        end if; 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-22
          • 2016-12-30
          • 1970-01-01
          • 2018-04-01
          • 1970-01-01
          • 2011-06-09
          • 1970-01-01
          相关资源
          最近更新 更多