2015-09-29 65 views
0

我試圖創建觸發器從​​表中獲取的validity值,並將其添加到startdate價值得到enddatedblog table.I寫這觸發。PL/SQL擺脫起始日期結束日期

dblog和​​表架構是這樣的

desc dblog; 
Name       Null? Type 
---------------------------- -------- ------- 
PLANID      NOT NULL NUMBER 
STARTDATE        DATE 
ENDDATE      NOT NULL DATE 

desc plan; 
Name       Null? Type 
---------------------------- -------- ------- 
PLANID      NOT NULL NUMBER 
VALIDITY      NOT NULL NUMBER 

默認列STARTDATESYSDATE價值。

CREATE OR REPLACE TRIGGER trg2 
BEFORE INSERT ON dblog FOR EACH ROW 
DECLARE 
    l_startdate date := SYSDATE; 
    l_enddate date; 
    l_validity number; 
BEGIN 
SELECT validity INTO l_validity 
    FROM plan 
    WHERE planid = :NEW.planid; 

l_endate := l_startdate + l_validity; 

SET :NEW.enddate := l_enddate; 

END; 
/

它顯示了以下錯誤:

10/2  PL/SQL: SQL Statement ignored 
10/6  PL/SQL: ORA-00922: missing or invalid option 

我使用錯誤的觀念還是什麼?我怎樣才能做到這一點?

+0

你好我可以問你在哪裏將得到:new.planid? – brenners1302

+0

插入到dblog執行表的位置在哪裏?它不會來自表'plan'的插入觸發器,是嗎? – TommCatt

回答

3

l_startdate SYSDATE;

您還沒有宣佈數據類型變量的SYSDATE是一個內置的功能,而不是數據類型。

如果要值在數據類型聲明的時間分配,然後執行它:

DECLARE 
    l_startdate DATE := SYSDATE; 

例如,

SQL> set serveroutput on 
SQL> DECLARE 
    2 start_dt DATE := SYSDATE; 
    3 BEGIN 
    4 dbms_output.put_line(start_dt); 
    5 END; 
    6/
29-SEP-15 

PL/SQL procedure successfully completed. 

SQL> 

UPDATE OP編輯的問題

以下查詢將失敗:

因爲您的觸發器是在dblog表中定義的,但是您指的是:​​表的新值。

此外,

SET :NEW.enddate := l_enddate; 

你不需要SET條款,只要做到這一點爲:

:NEW.enddate := l_enddate; 
+0

@addy查看更新 –

相關問題