0

我有两张桌子:

评估与评估_公告

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

任何帮助和指导将不胜感激!

谢谢!

4

2 回答 2

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;

请注意,OracleDATE始终包含一个日期组件和一个时间组件。所以sysdate + 7正好返回 24*7 = 168 小时前。如果当前是 2 月 26 日下午 4:00,它将在 3 月 5 日下午 4:00 返回。如果您希望触发器在 3 月 5 日的任何时间插入一行,assessment_announcement则需要. deadline_datetrunc(sysdate) + 7

于 2013-02-26T21:01:31.017 回答
0

我不相信你可以用触发器完成你想要的,因为你不能保证表格会在你想要的时间范围内更新。相反,您应该寻求运行一个存储过程来执行此操作,该过程可以按适当的时间间隔安排;每天或每 12 小时说一次。我已经使用 MSSQL 而不是 oracle 完成了此操作,但本文应该可以帮助您开始使用。

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

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
于 2013-03-27T18:36:17.070 回答