2014-02-25 63 views
1

我想創建一個表稱爲比賽的觸發器在施行約束是使用數據「STARTDATE < = MEETING.ENDDATE」在Oracle中創建一個觸發器,它從另一個表

換句話說

STARTDATE從比賽桌上必須小於或等於結束日期的會議桌(STARTDATE不能在這個日期後運行!)

我想觸發器添加一個記錄到比賽表時觸發並且輸入的startdate錯誤(startdate在會議表的結束日期之後)

我創造了這個目前爲止,但我不知道我是否正確或如何完成它!

CREATE OR REPLACE TRIGGER race_date_trg  
BEFORE INSERT OR UPDATE 
    ON RACE 
    FOR EACH ROW 
    WHEN (NEW.RACEID) 
    DECLARE STARTDATE DATE; 
    BEGIN 
    SELECT * FROM meeting INTO VARIABLE 
    IF STARTDATE <= ENDDATE THEN 
     INSERT INTO RACE (STARTDATE) VALUES (:n.startdate); 
    else 
    end (race_date_trg); 

感謝您的幫助!

+0

有你的代碼的幾個語法錯誤。也許[本文檔](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#BABBJHHG)將有所幫助。 –

回答

1

你的觸發器有很多錯誤。

  1. 您不必申報STARTDATE變量,你應該使用:new.STARTDATE
  2. 時的表情(:new.RACEID)是錯誤的
  3. 你必須選擇它之前聲明變量。
  4. 您的觸發器不應插入Race。如果開始日期不正確,您可能會引發錯誤。

觸發看起來是這樣的:

CREATE OR REPLACE TRIGGER race_date_trg  
BEFORE INSERT OR UPDATE 
    ON RACE 
    FOR EACH ROW 
    DECLARE 
    MEETING_ENDDATE DATE; 
    BEGIN 
    SELECT ENDDATE INTO MEETING_ENDDATE FROM meeting; 
    IF :NEW.STARTDATE > MEETING_ENDDATE THEN 
     RAISE_APPLICATION_ERROR(-20000, 'Wrong start date!'); 
    END IF: 
    end race_date_trg; 
相關問題