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; 

上記のトリガーを実行すると、以下のエラーが発生します。

エラー (12,2): PLS-00103: 次のいずれかを予期しているときに、シンボル「INSERT」が検出されました: ( - + case mod new not null continue avg count current exists max min before sql stddev sum difference execute forall merge time timestamp interval
日付パイプ
エラー (13,2): PLS-00103: シンボル "END" が見つかりました

4

2 に答える 2

2

Ravindra bagaleがすでに述べたことに加えて、以下を追加します。

初め。声明では

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

:の前にコロンがありませんNEW.INSTANCE_ID

そして2番目。コンストラクトと追加のmergeステートメントの代わりにof ステートメントを使用することを検討してください。例えば。IF .. THEN .. ELSE.. END IFselect

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;
于 2012-10-08T07:07:33.793 に答える
1

ここで使用ELSE instead of ELSIF
しますuはelseifを使用しましたが、elseは使用しませんでし
た。2つ以上の方法がある場合、elseifを使用できます。elseifを使用できます。

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
于 2012-10-08T06:31:40.843 に答える