【问题标题】:Error on executing trigger执行触发器时出错
【发布时间】:2012-09-28 09:16:43
【问题描述】:
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 prior sql stddev 和方差执行 forall 合并时间时间戳间隔
日期 管道
错误(13,2):PLS-00103:遇到符号“END”

【问题讨论】:

  • 语法错误的家伙。对不起。我已经解决了这个问题。

标签: sql oracle triggers oracle11g


【解决方案1】:

除了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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多