Trigger ERORR 00103

cullmann

Mitglied
Servus,

versuche mich gerade an nem Trigger, leider tritt immer die folgende Fehlermeldung auf:
Error(31,15): PLS-00103: Fand das Symbol "END" als eines der folgenden erwartet wurde: ( - + case mod new not null <an identifier> <a double-quoted delimited-identifier> <a bind variable> avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date <a string literal with character set specification> <a number> <a single-quoted SQL string> pipe <ein alternativ in Anführungszeichen gesetztes Zeichenfolgenliteral mit Zeichensatzangabe> <eine alter
Benutze Oracle 10g

TRIGGER:
-----------------------------------------------------------------------------

CREATE OR REPLACE
TRIGGER IU_LEHRVER_AFTER_STMT AFTER INSERT OR UPDATE ON LEHRVERANSTALTUNGEN
DECLARE
old_fachid FACH.fach%TYPE;
--in dieser Var. wird beim update die alte Fachid gespeichert
cursor lehrv is
select lehrid, bezeichung from LEHRVERANSTALTUNGEN
where stand_alone = 1 for update;

BEGIN
IF INSERTING then
for item in lehrv loop
execute:= package_fach.insert_FACH(fachseq.nextval, item.bezeichnung, item.lehrid);
end loop;
END IF;

IF UPDATING then
for item in lehrv
loop

select fachid into old_fachid from fach where SA_Lehrvera=item.lehrid;
--Die alte Fachid wird gespeicht, das sich diese beim Update
--nicht ändern darf!!

if old_fachid is null then
execute:= package_fach.insert_fach(fachseq.nextval, item.bezeichnung, item.lehrid);
ELSIF
-- execute:= package_fach.DELETE_Fach(item.lehrid);
--Beim Update muss der alte Zustand gelöscht werden, anderfalls
--würde man ein und die selbe Lehrva mehrfach als Fach eintragen
--execute package_fach.insert(old_fachid, item.bezeichnung, item.lehrid);

end if;
--Beim update auf Fach muss die alte Fachid erhalten bleiben,
end loop;
END IF;--END if updating

END IU_LEHRVER_AFTER_STMT;

Kann ja eigentlich nur ein Syntax error sein, vielleicht kann mir einer von euch auf die Sprünge helfen

Danke
 
Zunächst solltest du deinen Code bitte in die CODE oder SQL Tags setzen, dass man ihn einigermassen lesen kann. Ausserdem wäre es gut im Titel des Threads auch das Datenbanksystem anzugeben.

SQL:
CREATE OR REPLACE
    TRIGGER IU_LEHRVER_AFTER_STMT AFTER INSERT OR UPDATE ON LEHRVERANSTALTUNGEN
DECLARE
    old_fachid FACH.fach%TYPE;
    --in dieser Var. wird beim update die alte Fachid gespeichert
    cursor lehrv is
        select lehrid, bezeichung from LEHRVERANSTALTUNGEN
        where stand_alone = 1 for update;

BEGIN
    IF INSERTING then
        for item in lehrv loop
            execute:= package_fach.insert_FACH(fachseq.nextval, item.bezeichnung, item.lehrid);
        end loop;
    END IF;

    IF UPDATING then
        for item in lehrv loop

            select fachid into old_fachid from fach where SA_Lehrvera=item.lehrid;
            --Die alte Fachid wird gespeicht, das sich diese beim Update
            --nicht ändern darf!!

            if old_fachid is null then
                execute:= package_fach.insert_fach(fachseq.nextval, item.bezeichnung, item.lehrid);
            ELSIF
                -- execute:= package_fach.DELETE_Fach(item.lehrid);
                --Beim Update muss der alte Zustand gelöscht werden, anderfalls
                --würde man ein und die selbe Lehrva mehrfach als Fach eintragen
                --execute package_fach.insert(old_fachid, item.bezeichnung, item.lehrid);
            end if;
        
            --Beim update auf Fach muss die alte Fachid erhalten bleiben,
        end loop;
        
    END IF;--END if updating

END IU_LEHRVER_AFTER_STMT;

Der Fehler liegt vermutlich hier:
SQL:
ELSIF
                -- execute:= package_fach.DELETE_Fach(item.lehrid);
                --Beim Update muss der alte Zustand gelöscht werden, anderfalls
                --würde man ein und die selbe Lehrva mehrfach als Fach eintragen
                --execute package_fach.insert(old_fachid, item.bezeichnung, item.lehrid);
end if;
Deine ELSE Anweisung ist leer, bzw. es stehen nur Kommentare drin. Entweder nimmst du das ELSIF ganz raus, oder fügst einfach die Anweisung "NULL;" zwischen ELSIF und END IF;
 
Zuletzt bearbeitet von einem Moderator:
Servus, habs selbst rausgefunden, problem was das exceute... SP werden im block ja ohen exceute ausgeführt....

Trotzdem danke

Code:
CREATE OR REPLACE
TRIGGER IU_LEHRVER_AFTER_STMT AFTER INSERT OR UPDATE ON LEHRVERANSTALTUNGEN 
DECLARE
  old_fachid FACH.fachid%TYPE;
  --in dieser Var. wird beim update die alte Fachid gespeichert
  cursor lehrv is
	select lehrid, bezeichnung from LEHRVERANSTALTUNGEN 
        where stand_alone = 1 for update;
      
BEGIN  
  IF INSERTING then
  
    for item in lehrv loop    
         package_fach.insert_FACH(item.bezeichnung, item.lehrid);
    end loop;
  END IF;
  
  IF UPDATING then
      for item in lehrv 
      loop 
      
             select fachid into old_fachid from fach where SA_Lehrvera=item.lehrid;
              --Die alte Fachid wird gespeicht, das sich diese beim Update 
              --nicht ändern darf!!
              
              if old_fachid is null then
                package_fach.insert_fach(item.bezeichnung, item.lehrid);
              ELSE 
                
                 package_fach.DELETE_Fach(item.lehrid);
                --Beim Update muss der alte Zustand gelöscht werden, anderfalls
                --würde man ein und die selbe Lehrva mehrfach als Fach eintragen
                package_fach.insert_fach(old_fachid, item.bezeichnung, item.lehrid);
                --Hier aufruf der Überladenen Methode package_fach.insert_fachs
              END IF;
              --Beim update auf Fach muss die alte Fachid erhalten bleiben
              
      end loop;
  END IF;--END if updating

END IU_LEHRVER_AFTER_STMT;
 
Zurück