PL / SQL Создание триггера, который проверяет SYSDATE по диапазону дат - PullRequest
0 голосов
/ 02 июня 2019

Создание триггера, который блокирует обновления таблицы в течение одной недели после каждого первого января каждого года.

Я пытаюсь принять значения 01 января как символ 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;

Ответы [ 4 ]

2 голосов
/ 02 июня 2019

Делай, что хочешь?

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;
1 голос
/ 03 июня 2019

Альтернативный метод для этого:

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 здесь

0 голосов
/ 04 июня 2019

Дата 1 января доступна путем усечения sysdate до года: "trunc (sysdate, 'yyyy')". Таким образом, в этом случае вы получите желаемый результат без дополнительных переменных и одного вызова функции на

if sysdate < trunc(sysdate,'yyyy')+7 
then 
    raise application_error(-20004, 'error message'); 
end if; 
0 голосов
/ 03 июня 2019

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

...