sabinechrista
Grünschnabel
Hi,
ich habe hier ein trigger problem und vielleicht kann mir ja jemand einen tip geben.
Es sind zwei tabellen TBL=kopftabelle und DET=Kindtabelle.
TBL:
SCHL_DAT_RH_NR asc
SCHL_DAT_ORD asc
Y_AEND_ZAEHL
...
DET:
SCHL_DAT_RH_NR asc
SCHL_DAT_ORD asc
FOLGR_NR asc
ORD_NR asc
SCHLUESSEL
...
In der DET muß es immer einen Satz mit schlüssel = blank geben. dieser kann über eine dialoganwendung angelegt werden. Es werden die ord_nr 1-8 verwendet. ist nun kein blank-wert vorhaben, soll es einen "pseudo"- satz mit schluessel = blank und ord_nr = 9 geben. wird nun aber ein zweiter satz in DET mit schluessel = blank gecshrieben oder geupdatet, dann soll
der DET-Satz mit der ord_nr=9 wieder gelöscht werden. ungekehrt, wird ein satz mit svhluessel = blank gelöscht oder in schluessel ein wert gecshrieben, dann muß wieder ein "Pseudo"-Satz mit ord_nr = 9 ud schluessel 0 blank gecshrieben werden.
mein trigger sieht so aus:
Auf die DET kann ich den trigger ja nicht legen, das sie selber geändret wird. Nun ist es so, dass in TBL ein Änderungszähler Y_AEND_ZAEHL fortgeschrieben wird wenn in DET eine Änderung stattfindet. Daher liegt der Trigger nun auf TBL.
Ich finde keine anderes event, von wo aus ich den trigger feuern könnte. leider wird dieser Zähler schon vor dem schreiebn auf DET verändert, so dass es nicht funktionierte. Erst hatte ich meinen Trigger ohne
PRAGMA AUTONOMOUS_TRANSACTION,
da bekam ich den Fehler: ..DET wird gerade geändert, Trigger/Funktion sieht dies möglicherweise nicht
Mit PRAGMA AUTONOMOUS_TRANSACTION kommt nun keine Oracle-fehler mehr aber der trigger tut nicht was er soll.
Gibt es noch eine andere Möglichkeit dieses Problem per Trigger zu lösen
Grüße, Sabine
Trigger/Funktion sieht dies möglicherweise nicht
ich habe hier ein trigger problem und vielleicht kann mir ja jemand einen tip geben.
Es sind zwei tabellen TBL=kopftabelle und DET=Kindtabelle.
TBL:
SCHL_DAT_RH_NR asc
SCHL_DAT_ORD asc
Y_AEND_ZAEHL
...
DET:
SCHL_DAT_RH_NR asc
SCHL_DAT_ORD asc
FOLGR_NR asc
ORD_NR asc
SCHLUESSEL
...
In der DET muß es immer einen Satz mit schlüssel = blank geben. dieser kann über eine dialoganwendung angelegt werden. Es werden die ord_nr 1-8 verwendet. ist nun kein blank-wert vorhaben, soll es einen "pseudo"- satz mit schluessel = blank und ord_nr = 9 geben. wird nun aber ein zweiter satz in DET mit schluessel = blank gecshrieben oder geupdatet, dann soll
der DET-Satz mit der ord_nr=9 wieder gelöscht werden. ungekehrt, wird ein satz mit svhluessel = blank gelöscht oder in schluessel ein wert gecshrieben, dann muß wieder ein "Pseudo"-Satz mit ord_nr = 9 ud schluessel 0 blank gecshrieben werden.
mein trigger sieht so aus:
SQL:
CREATE OR REPLACE TRIGGER TBL
after update ON TBL
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
v_anzahl NUMBER(10);
v_anzahl_9 NUMBER(10);
v_anzahl_wert NUMBER(10);
BEGIN
SELECT COUNT(*) INTO v_anzahl
FROM DET WHERE SCHL_DAT_RH_NR = :NEW.SCHL_DAT_RH_NR and SCHL_DAT_ORD = :NEW.SCHL_DAT_ORD
and SCHLUESSEL = ' ';
IF v_anzahl = 0 THEN
INSERT INTO DET(SCHL_DAT_RH_NR,SCHL_DAT_ORD,SCHLUESSEL,FOLGE_NR,ORD_NR,BEZ15,EFFDT,EFF_STATUS)
VALUES(:new.SCHL_DAT_RH_NR,:new.SCHL_DAT_ORD,' ',1,9,' ',null,' ');
commit;
else
SELECT COUNT(*) INTO v_anzahl_9
FROM DET WHERE SCHL_DAT_RH_NR = :NEW.SCHL_DAT_RH_NR and SCHL_DAT_ORD = :NEW.SCHL_DAT_ORD
and SCHLUESSEL = ' ' and ord_nr = 9;
SELECT COUNT(*) INTO v_anzahl_wert
FROM DET WHERE SCHL_DAT_RH_NR = :NEW.SCHL_DAT_RH_NR and SCHL_DAT_ORD = :NEW.SCHL_DAT_ORD
and SCHLUESSEL = ' ' and ord_nr <> 9;
if v_anzahl_wert > 0
and v_anzahl_9 > 0 then
-- 9er-leersatz vorhanden + leerwerte satz vorhanden => 9-er-leersatz löschen
DELETE from DET WHERE SCHL_DAT_RH_NR = :new.SCHL_DAT_RH_NR and SCHL_DAT_ORD = :new.SCHL_DAT_ORD
and SCHLUESSEL = ' ' and ORD_NR = 9;
commit;
END IF;
end if;
END;
Auf die DET kann ich den trigger ja nicht legen, das sie selber geändret wird. Nun ist es so, dass in TBL ein Änderungszähler Y_AEND_ZAEHL fortgeschrieben wird wenn in DET eine Änderung stattfindet. Daher liegt der Trigger nun auf TBL.
Ich finde keine anderes event, von wo aus ich den trigger feuern könnte. leider wird dieser Zähler schon vor dem schreiebn auf DET verändert, so dass es nicht funktionierte. Erst hatte ich meinen Trigger ohne
PRAGMA AUTONOMOUS_TRANSACTION,
da bekam ich den Fehler: ..DET wird gerade geändert, Trigger/Funktion sieht dies möglicherweise nicht
Mit PRAGMA AUTONOMOUS_TRANSACTION kommt nun keine Oracle-fehler mehr aber der trigger tut nicht was er soll.
Gibt es noch eine andere Möglichkeit dieses Problem per Trigger zu lösen
Grüße, Sabine
Trigger/Funktion sieht dies möglicherweise nicht
Zuletzt bearbeitet von einem Moderator: