2012-02-04 25 views
-2

我遇到觸發器無法正常工作的問題。這裏是我的觸發代碼Oracle SQL觸發器導致編譯錯誤

create or replace trigger "ZIVOTINJE_T2" 
BEFORE 
insert or update on "ZIVOTINJE" 
for each row 
begin 
IF new.cijena>10 THEN 
    :new.cijena:=9.9 

ELSEIF new.cijena<0 THEN 
    :new.cijena:=0.1 
END IF; 
end; 

當我嘗試在表ZIVOTINJE插入實體,我得到這個

ORA-04098: trigger 'DENISS.ZIVOTINJE_T2' is invalid and failed re-validation 
+1

該消息表示觸發代碼中存在一個或多個語法錯誤。請看文檔來解決這些問題。 http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm#ADFNS012 – APC 2012-02-04 14:53:31

回答

5

我可以看到你的觸發的代碼三個問題:

  • 您需要使用:new(包括冒號)參考行的新值,而不是new

  • 要更改即將被插入/更新的值,寫入:new.cijena := 9.9;代替SET new.cijena=9.9。請注意,(a)這裏沒有SET關鍵字; (b)賦值運算符爲:=,而不是=;和(c)你需要在行尾有一個分號。使用ELSIF代替ELSEIF

最後,在SQL * Plus,可以使用SHOW ERRORS TRIGGER "ZIVOTINJE_T2"以顯示此觸發器的錯誤。

+0

我沒有你說的話,現在的代碼如下所示 創建或替換觸發「ZIVOTINJE_T2」 前 在每一行上插入或更新「ZIVOTINJE」 begin 如果new.cijena> 10 THEN :new.cijena:= 9.9; ELSEIF new.cijena <0 THEN :new.cijena:= 0.1; END IF; 結束; 它仍然給我同樣的錯誤信息 – user1189428 2012-02-04 14:39:32

+3

@ user1189428:你還沒有完成我說的一切。你沒有把'ELSEIF'改爲'ELSIF',並且還有兩個沒有冒號的'new'(在'> 10'和'<0'之前)。另外,請避免在評論中張貼太多的代碼。編輯您的問題來添加修改的代碼。 – 2012-02-04 15:38:30

0

試試這個。

CREATE OR REPLACE TRIGGER 「ZIVOTINJE_T2」 之前 「ZIVOTINJE」 每行 插入或更新 開始 IF:new.cijena = 10 THEN :new.cijena:= 9.9;
ELSE 如果:new.cijena < 0 THEN :new.cijena:= 0.1; END IF; end if; 結束;