2012-10-08 60 views
1
CREATE OR REPLACE TRIGGER PROCESS_POPULATE_INSTANCE 
AFTER INSERT OR UPDATE ON PROCESS_INSTANCE 
FOR EACH ROW 
DECLARE 
InstanceExists NUMBER; 
BEGIN 
SELECT COUNT(*) 
INTO InstanceExists 
FROM TEST_PROCESSDATA 
WHERE TEST_PROCESSDATA.PROCESS_INSTANCE_ID = :NEW.INSTANCE_ID ; 

IF (InstanceExists > 0) THEN 
UPDATE TEST_PROCESSDATA SET PROCESS_STATUS =:NEW.STATUS WHERE PROCESS_INSTANCE_ID = NEW.INSTANCE_ID; 
ELSIF 
INSERT INTO TEST_PROCESSDATA (PROCESS_INSTANCE_ID,PROCESS_STATUS, STARTED_TIME) VALUES (:NEW.INSTANCE_ID,:NEW.STATUS,:NEW.START_TIME); 
END IF; 
END PROCESS_POPULATE_APPDATA; 

在執行上述觸發,我得到下面的錯誤:錯誤上執行觸發

Error(12,2): PLS-00103: Encountered the symbol "INSERT" when expecting one of the following: (- + case mod new not null continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval
date pipe
Error(13,2): PLS-00103: Encountered the symbol "END"

+0

語法錯誤傢伙。抱歉。我解決了這個問題。 – Vivek

回答

1

使用ELSE instead of ELSIF
這裏ü使用ELSEIF,但僅此而已使用,你無法使用ELSEIF無否則
當有兩種以上的方式,那麼你可以使用elsif。

IF (InstanceExists > 0) THEN 
UPDATE TEST_PROCESSDATA SET PROCESS_STATUS =:NEW.STATUS WHERE PROCESS_INSTANCE_ID = NEW.INSTANCE_ID; 
ELSE 
INSERT INTO TEST_PROCESSDATA (PROCESS_INSTANCE_ID,PROCESS_STATUS, STARTED_TIME) VALUES (:NEW.INSTANCE_ID,:NEW.STATUS,:NEW.START_TIME); 
END IF; 
END PROC 
2

除了什麼Ravindra bagale已經注意到我添加如下內容:

第一。在聲明中

UPDATE TEST_PROCESSDATA SET PROCESS_STATUS =:NEW.STATUS 
WHERE PROCESS_INSTANCE_ID = NEW.INSTANCE_ID; 

:結腸中缺少的NEW.INSTANCE_ID

以及第二前。您可以考慮使用merge聲明而不是IF .. THEN .. ELSE.. END IF聲明和其他select聲明。例如。

create or replace trigger process_populate_instance  
after insert or update on process_instance 
for each row 
begin 

    merge into test_processdata 
    using dual 
    on (process_instance_id = :new.instance_id) 
    when matched 
    then update 
      set process_status =:new.status 
    when not matched 
    then insert (process_instance_id,process_status, started_time) 
     values (:new.instance_id,:new.status,:new.start_time); 

end;