2012-12-10 38 views
0

創建一個觸發器來計算在ContractInfo中插入元組時的持續時間列的值。如何在Oracle中創建計算派生值的觸發器

ContractInfo Table 
HAS_CONTRACT   DATE_FROM DATE_TO  DURATION 
--------------------- --------- --------- ---------- 
Simon Palm   20-AUG-01 19-AUG-02   0 
Simon Palm   20-SEP-02 19-AUG-03   0 
Flut     10-JUN-99 09-SEP-02   0 

我該如何製作觸發器?我有點與觸發器混淆。

+1

什麼類型的SQL的?觸發器是特定於實現的。 – RBarryYoung

+0

你有[任何嘗試](http://www.whathaveyoutried.com)? – Kermit

+0

這是RBDMS的用途嗎?此外,我假設這是一項家庭作業,你必須符合這個要求...因爲否則計算列可能會更有意義。 –

回答

3
SQL> create or replace trigger ContractInfo_buifer 
    2 before insert or update on contractinfo 
    3 for each row 
    4 declare 
    5 begin 
    6 :new.duration := :new.date_to - :new.date_from; -- answer in days. 
    7 END; 
    8/

Trigger created. 

SQL> insert into ContractInfo (HAS_CONTRACT, DATE_FROM, DATE_TO) values ('Simon Palm', to_date('20-AUG-01', 'dd-mon-rr'), to_date('19-AUG-02', 'dd-mon-rr')) 
    2/

1 row created. 

SQL> select * from contractinfo; 

HAS_CONTRA DATE_FROM DATE_TO  DURATION 
---------- --------- --------- ---------- 
Simon Palm 20-AUG-01 19-AUG-02  364 
0

這是我如何與甲骨文這樣做:

CREATE OR REPLACE TRIGGER TRIG_ContractInfo 
    BEFORE INSERT OR UPDATE ON ContractInfo REFERENCING 
    NEW AS NEW 
    OLD AS OLD 
    FOR EACH ROW 
DECLARE 
BEGIN 
    IF INSERTING THEN 
    /* ON INSERT STATEMENTS */ 
    END IF; 
    IF UPDATING THEN 
    /* ON UPDATE STATEMENTS */ 
    END IF; 
    /* COMMON STATEMENTS */ 
END; 
/
+0

請問您能解釋一下這個sql查詢嗎?謝謝 – user1851359

+0

爲什麼你需要引用子句? (我不知道爲什麼有人需要它,但這裏顯得特別沒有意義,因爲你沒有重命名任何東西)。 – Ben

+0

@Ben:絕對沒有意義,除非你告訴這個似乎不瞭解PL/SQL的人。所以在這裏我想出了我的TRIGGER模板,我通常從需要編碼的模板開始。 這只是一個提示如何進行的人,最簡單的方法,以防萬一他會在甲骨文。 我可以看到它讓你感到沮喪,好吧,我明白了,我爲你提供一個小小的擁抱,幫助你更好地睡覺,親愛的。 – menssana