执行触发器时出错

时间:2012-10-08 06:26:45

标签: sql oracle triggers oracle11g

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; 

在执行上述触发器时,我收到以下错误:

  

错误(12,2):PLS-00103:遇到以下其中一项时遇到符号“INSERT”:( - + case mod new not null continue avg count current exists max min before sql   stddev sum variance执行forall merge time timestamp interval
  日期    管道   错误(13,2):PLS-00103:遇到符号“END”

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

使用ELSE instead of ELSIF
在这里你使用了elseif,但没有使用else,你不能使用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