创建一个触发器,该触发器在每年的1月1日之后的一周内阻止Table的更新。
我尝试将1月1日的值作为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;
答案 0 :(得分:2)
这是您想要的吗?
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 :(得分:1)
执行此操作的另一种方法是:
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;
答案 2 :(得分:0)
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语句的衬里
答案 3 :(得分:0)
可以通过将sysdate截断为年份来获取日期1月1日:“ trunc(sysdate,'yyyy')”。因此,在这种情况下,无需其他变量即可获得所需的结果,并且只需
if sysdate < trunc(sysdate,'yyyy')+7
then
raise application_error(-20004, 'error message');
end if;