2013-02-26 96 views
0

更新我有兩個表:的Oracle SQL觸發器 - 在最新

評估和Assessment_Announcement

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_ANNOUNCEMENT」表時在DEADLINE_DATE日期評估表中的列在7天內。數據可能已經存儲了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 

任何幫助和指導,將不勝感激!

謝謝!

+0

您現有的代碼會出現什麼問題? – 2013-02-26 20:57:43

回答

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點,它將在3月5日下午4點返回。如果你希望觸發器在assessment_announcement中插入一行,如果deadline_date是3月5日的任何時間,則需要trunc(sysdate) + 7

+0

大家好!到目前爲止的幫助非常好,我期待着去獲得一些代碼來工作! :)一點 - 如果評估截止日期已經在一個月前輸入,並且變成需要觸發更新,因爲日期已經變成7天內到期 - 這不是真正的觸發器嗎?因爲用戶沒有在截止日期前7天插入 - 但我仍然希望觸發?我看不到任何其他更新方式。對不起,有任何困惑。並再次感謝! – user2112730 2013-02-26 21:21:53

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