Oracle SQL Trigger - 日期更新

时间:2013-02-26 20:55:51

标签: sql oracle triggers

我有两张桌子:

评估和评估_公告

CREATE TABLE  "ASSESSMENT" 
  (     "ASSESSMENT_NAME" VARCHAR2(50) NOT NULL ENABLE, 
        "DEADLINE_DATE" DATE NOT NULL ENABLE, 
        CONSTRAINT "ASSESSMENT_PK" PRIMARY KEY ("ASSESSMENT_NAME") ENABLE
  )

CREATE TABLE  "ASSESSMENT_ANNOUNCEMENT" 
   (    "ASSESSMENT_NAME" VARCHAR2(50) NOT NULL ENABLE, 
        "DEADLINE_DATE" DATE NOT NULL ENABLE, 
        "ATTENTION" VARCHAR2(500) NOT NULL ENABLE, 
  CONSTRAINT "ASSESSMENT_ANNOUNCEMENT_PK" PRIMARY KEY ("ASSESSMENT_NAME")  ENABLE
   )

我正在考虑实施一个触发器,当ASSESSMENT表的DEADLINE_DATE列中的日期在7天内时,该触发器会更新到'ASSESSMENT_ANNOUNCEMENT'表。数据可能已存储14天,但是在截止日期的7天内 - 它会触发。除非插入日期在截止日期的7天内,否则不应在插入时触发。

到目前为止,我有以下代码:

CREATE OR REPLACE TRIGGER  "TEST" 
AFTER INSERT ON ASSESSMENT
FOR EACH ROW
BEGIN
insert into ASSESSMENT_ANNOUNCEMENT(ASSESSMENT_NAME, DEADLINE_DATE, ATTENTION)
values (:new.ASSESSMENT_NAME, :new.DEADLINE_DATE, 'DEADLINE IS 7 DAYS OR LESS');
WHERE DEADLINE_DATE >= (SYSDATE) - 7

非常感谢任何帮助和指导!

谢谢!

2 个答案:

答案 0 :(得分:0)

这听起来像你想要的

BEGIN
  IF :new.deadline_date >= sysdate + 7
  THEN
    INSERT INTO assessment_announcement( assessment_name, deadline_date, attention )
      VALUES( :new.assessment_name, :new.deadline_date, 'Deadline is 7 days or less' );
  END IF;
END;

请注意,Oracle DATE始终包含日期组件和时间组件。所以sysdate + 7确切地返回24 * 7 = 168小时前。如果它当前是2月26日下午4:00,它将在3月5日下午4:00返回。如果assessment_announcement如果deadline_date是3月的任何时间,您希望触发器在trunc(sysdate) + 7中插入一行5,你需要{{1}}。

答案 1 :(得分:0)

我不相信你可以用触发器完成你想要的东西,因为你不能保证在你想要的时间范围内更新表。相反,您应该寻找运行存储过程来执行此操作,可以在适当的时间间隔进行调度;每天或每12小时说一次。我用MSSQL而不是oracle做过这个,但这个article应该可以帮助你开始上路。

您要安排的PL-SQL BLock是您上面的查询。您可以将其修改为

insert into ASSESSMENT_ANNOUNCEMENT(ASSESSMENT_NAME, DEADLINE_DATE, ATTENTION)
Select ASSESSMENT_NAME, DEADLINE_DATE, 'Deadline is 7 days or less'
FROM ASSESSMENT
WHERE DEADLINE_DATE >= (SYSDATE) - 7