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....
Und die schöne Fehlermeldung sieht dann so aus:
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
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