ERROR: Zeichenfolgenpuffer zu klein /ORCLE

cullmann

Mitglied
Hallo Forum,

schreibe gerade an einem Trigger der das löschen auf einer Tabelle absicheren soll. Leider bekomme ich eine Fehlermeldung die ich mir einfach nicht erklären kann, kann leider auch nciht lokalisieren was diesen Fehler verursacht....

SQL:
CREATE OR REPLACE
TRIGGER IUD_BEFORE_FACH BEFORE INSERT OR UPDATE OR DELETE ON FACH 
FOR EACH ROW 
declare

v_endtermin Semester.ENDTERMIN%Type;
b_angeboten boolean := false;
b_besucht boolean := false;
v_err_msg Varchar2(500);


cursor termin_cur (fachid_in IN NUMBER) 
is
    select semesterid, endtermin from semester 
    where semesterid = (select semesterid from semester_faecher 
                        where fachid = fachid_in) 
                        --and rownum = 1 for update;
                       and rownum = 1;
                       
cursor teilnehmer_cur(fachid_in IN NUMBER) 
is
    select studentid from Stud_bezieh_SF 
    where fachid = fachid_in for update;
    
Begin
  if package_fach.von_package_fach then
        null;
  else
         RAISE_APPLICATION_ERROR(-20044,
               'DML muss vom Package_Fach ausgehen |Trigger: IUD_BEFORE_FACH');
  end if;


IF Updating then
    
    if :new.Fachid <>:old.Fachid then
      Raise_application_error (-20144, 
                          'Die FachID darf nicht verändert werden');
    end if;
    if :new.SA_Lehrvera <>:old.SA_Lehrvera then
      RAISE_APPLICATION_ERROR (-20145, 
                      'Die zuordnung zu dem SA darf nicht verändert werden');
    end if;
    if :old.SA_Lehrvera is not null and :new.Fachname <> :old.Fachname then
      Raise_application_error(-20146, 
                  'Bei einem Fach das von einer SA abgeleitet wurde darf der 
                  Fachname nicht geändert werden! Möchten Sie den Fachnamen 
                  ändern, müßten Sie die Bezeichnung der SA direkt ändern.');
    end if;
END IF;

IF Deleting then    
      
/*An dieser Stelle wird überprüft ob der zu löschende Kurs überhaupt an-
  geboten wird.*/    
   begin 
        select max(endtermin) into v_endtermin from semester 
        where semesterid in (select semesterid from semester_faecher 
                            where fachid = :old.fachid);
        b_angeboten :=true;
    
    Exception
      when no_data_found then
        --Wenn kein Enddatum gefunden, wird das fach noch nicht angeboten
          null;
        /*for i in (select Lehrid from lehrveranstaltungen where fachid = :old.fachid) 
        loop
          package_dok.delete_dok(i.LehrID);
          --Die Dokumente zu dem Fach müssen gelöscht werden
        end loop;
Schleife ist doch hier totaler schwachsinn*/  
    end; 
    
    for item in termin_cur(:old.fachid) loop
        b_angeboten := true;
        --FETCH termin_cur into v_endtermin;---WARUM klapp das einlesen nicht
    end loop;
    
    for item in teilnehmer_cur(:old.Fachid) loop
        b_besucht :=true;
    end loop;
    
/*Auf die For Schleifen kann man verzichten wenn man es so macht wie mit dem 
enddatum, wenn das mit dem fetch klapp kann man die FOR-Schleifen behalten*/           
    IF b_angeboten then
        if v_endtermin < (sysdate + INTERVAL '2' YEAR) then
            if b_besucht then
                  v_err_msg:= 'Das löschen des Faches ist erst nach zwei Jahren
                               zulässig, zumal noch Studenten für diesen Kurs 
                               eingeschrieben sind';
                  RAISE_APPLICATION_ERROR(-20024, v_err_msg);
            else --wenn nicht besucht, kann selbst vor zwei Jahren gelöscht werden
                  if :old.SA_Lehrvera = 1 then
                      --Package_Lehrveranstaltung.folge_delete := true;
                      Package_Lehrveranstaltung.DELETE_LEHRVER(:old.SA_Lehrvera);
                      --Package_Lehrveranstaltung.folge_delete := false;
                      /*Die enstprechende SA wird gelöscht*/
                  else --Alle NSA welche zu diesem Fach gehören müssen gelöscht werden
                      --Package_Lehrveranstaltung.folge_delete := true;
                      Package_Lehrveranstaltung.DELETE_LEHRVER_NSA(:old.FachID);
                      --Package_Lehrveranstaltung.folge_delete := false;
                      for i in (select Lehrid from lehrveranstaltungen where fachid = :old.fachid) 
                      loop
                        package_dok.delete_dok(i.LehrID);
                        --Die Dokumente zu dem Fach müssen gelöscht werden
                      end loop;  
                  end if;
                  /*Die betreffenden Einträge in Semester_Faecher können dann
                    gelöscht werden*/
                  Package_Semester_Faecher.Delete_SF(:old.FachID);
            end if;
        else--wenn älter als zwei Jahre kann gelöscht werden
            if :old.SA_Lehrvera = 1 then
                      --Package_Lehrveranstaltung.folge_delete := true;
                      Package_Lehrveranstaltung.DELETE_LEHRVER(:old.SA_Lehrvera);
                      --Package_Lehrveranstaltung.folge_delete := false;
                      
                      Package_dok.delete_dok(:old.SA_Lehrvera);
            else --Alle NSA welche zu diesem Fach gehören müssen gelöscht werden
                      --Package_Lehrveranstaltung.folge_delete := true;
                      Package_Lehrveranstaltung.DELETE_LEHRVER_NSA(:old.FachID);
                      --Package_Lehrveranstaltung.folge_delete := false;
                      for i in (select Lehrid from lehrveranstaltungen where fachid = :old.fachid) 
                      loop
                        package_dok.delete_dok(i.LehrID);
                        --Die Dokumente zu dem Fach müssen gelöscht werden
                      end loop;  
            
            end if;
            /*Die betreffenden Einträge in Semester_Faecher können dann
              gelöscht werden*/
              Package_Semester_Faecher.Delete_SF(:old.FachID);
        end if;
                       
    ELSE--Wenn nicht angeboten kann gelöscht werden
    begin
            if :old.SA_Lehrvera = 1 then
                      --Package_Lehrveranstaltung.folge_delete := true;
                      Package_Lehrveranstaltung.DELETE_LEHRVER(:old.SA_Lehrvera);
                      --Package_Lehrveranstaltung.folge_delete := false;
                      
                      Package_dok.delete_dok(:old.SA_Lehrvera);
                      
            else --Alle NSA welche zu diesem Fach gehören müssen gelöscht werden
                      --Package_Lehrveranstaltung.folge_delete := true;
                      Package_Lehrveranstaltung.DELETE_LEHRVER_NSA(:old.FachID);
                      --Package_Lehrveranstaltung.folge_delete := false;
                      for i in (select Lehrid from lehrveranstaltungen where fachid = :old.fachid) 
                      loop
                        package_dok.delete_dok(i.LehrID);
                        --Die Dokumente zu dem Fach müssen gelöscht werden
                      end loop;  
            
            end if;
            --Der betreffende Eintrag in Semster_F kann gelöscht werden
            Package_Semester_Faecher.Delete_SF(:old.FachID);
    exception 
      when others then
         v_err_msg:='TRIGGER D_BEFORE_FACH1: '||SUBSTR(SQLERRM,1,500);
 	    RAISE_Application_ERROR(-20023,v_err_msg);
        
    end;
    END IF;
END IF;--if Deleting
EXCEPTION 
    WHEN OTHERS THEN
 	    v_err_msg:='TRIGGER D_BEFORE_FACH2: '||SUBSTR(SQLERRM,1,500);
 	    RAISE_Application_ERROR(-20021,v_err_msg);

END IUD_BEFORE_FACH;

Und die schöne Fehlermeldung sieht dann so aus:

Code:
ORA-20021: TRIGGER D_BEFORE_FACH2: ORA-06502: PL/SQL: numerischer oder Wertefehler: Zeichenfolgenpuffer zu klein
ORA-06512: in "ICAP.D_BEFORE_LEHRVERA", Zeile 19
ORA-20008: Lehrveranstaltungen welche Bestandteil von Fächern sind dürfen nicht
       gelöscht werden, Sie müssen das enstprechende Fach direkt löschen.
       Dann werden die zugehörigen Lehrveranstaltungen mitgelöscht
ORA-04088: Fehler bei der Ausführung von Trigger 'ICAP.D_BEFORE_LEHRVERA'
ORA-06512: in "ICAP.IUD_BEFORE_FACH", Zeile 197
ORA-04088: Fehler bei der Ausführung von Trigger 'ICAP.IUD_BEFORE_FACH'
ORA-06512: in "ICAP.PACKAGE_FACH", Zeile 62
ORA-06512: in Zeile 1

also an der Var. v_err_msg kann es nciht liegen, bei der hab ich schon einige andere größen durchgespielt, leider war meine suche in der doku auch net so erfolgreich. Hoffe das einer von euch mir wieder helfen kann.

Cullmann
 
So ich konnte den Fehler jetzt zumindest lokalisieren

Code:
 else --Alle NSA welche zu diesem Fach gehören müssen gelöscht werden
                      Package_Lehrveranstaltung.folge_delete := true;
                      dbms_output.put_line('HIernach entsthet der Fehler'||:old.Fachid);
                      Package_Lehrveranstaltung.DELETE_LEHRVER_NSA(:old.FachID); --HIER ist der Fehler!!
                      Package_Lehrveranstaltung.folge_delete := false;
                      for i in (select Lehrid from lehrveranstaltungen where fachid = :old.fachid) 
                      loop
                        package_dok.delete_dok(i.LehrID);
                        --Die Dokumente zu dem Fach müssen gelöscht werden
                      end loop;

das komische ist das die SP die ich an dieser stelle anspreche eingentlich nix dolles ist:

Code:
procedure delete_Lehrver_NSA(dFachID_IN IN NUMBER) is
       begin
       von_package :=true;
          delete Lehrveranstaltungen
          where FachID = dFachID_in;
       von_package :=false;

  end delete_Lehrver_NSA;

Wenn ich die SP mal direkt anspreche, kommt die gleiche Fehlermeldung:
Code:
declare
begin
PACKAGE_LEHRVERANSTALTUNG.folge_delete := true;
Package_Lehrveranstaltung.DELETE_LEHRVER_NSA(201);
PACKAGE_LEHRVERANSTALTUNG.folge_delete:= false;
end;
---------------------------------------------------------------------------------------------------------------


Error starting at line 1 in command:
declare
begin
PACKAGE_LEHRVERANSTALTUNG.folge_delete := true;
Package_Lehrveranstaltung.DELETE_LEHRVER_NSA(201);
PACKAGE_LEHRVERANSTALTUNG.folge_delete:= false;
end;
Error report:
ORA-06502: PL/SQL: numerischer oder Wertefehler: Zeichenfolgenpuffer zu klein
ORA-06512: in "ICAP.D_BEFORE_LEHRVERA", Zeile 19
ORA-20008: Lehrveranstaltungen welche Bestandteil von Fächern sind dürfen nicht
       gelöscht werden, Sie müssen das enstprechende Fach direkt löschen.
       Dann werden die zugehörigen Lehrveranstaltungen mitgelöscht
ORA-04088: Fehler bei der Ausführung von Trigger 'ICAP.D_BEFORE_LEHRVERA'
ORA-06512: in "ICAP.PACKAGE_LEHRVERANSTALTUNG", Zeile 81
ORA-06512: in Zeile 4

Also der Grundgedanke der hinter meinem konsturkt steht ist folgender:
Ein Trigger sitzt auf der Tablle Leherveranstaltugen, dieser stellt sicher das keine Lehrveranstaltungen direkt glöscht werden können.
Ein löschen von Lehrveranstaltugen soll nur zulässig sein wenn sie als Folge eines Löschvorgangen eines Faches resultiert.
So deswegen überprüft der Trigger auf Lehrveranstaltungen ob die Var. folge_delete := true ist.
Anscheinend geht das net so ohne weites.
 
OK, das Probelm hast sich von allein gelöst.
Ursach war ein ander Trigger, welcher eine Ähnliche Feherquelle abdrecken sollte.

Was ich aber immer noch nicht vestehe ist wieso mir das dann also solch ein Komische und auch irreführende Fehlermeldugen geliefert wurde.


cullmann
 

Neue Beiträge

Zurück