Trigger - mutowanie

0

Witam.
Mam trigger jak poniżej - trigger działa, zaszła konieczność wykonania modyfikacji.
Zależy mi na pobraniu z tabeli ppr wartosci max (cnzn) dla :new.ntr
a pozniej zaktualizowania tej wartosci w tabeli pp (czyli tej na ktorej wykonuje sie trigger).
Caly czas mam blad z mutowaniem obiektu.
Probowalem zrobic to pętlą (analogicznie jak inne elementy w tym kodzie).
bezposrednio przypisac wartosc select (max) ..... a pozniej :new.cnmn=zmienna;
niestety to samo.
Czesc ktora chcialbym dopisac oznaczylem ulokowalem pomiedzy w poniższym kodzie##############
Czy ktos ma jakis pomysl?

DROP TRIGGER PPR_WYZNACZ_CENE_MIN;

CREATE OR REPLACE TRIGGER PPR_WYZNACZ_CENE_MIN
BEFORE INSERT OR UPDATE OF STAT ON PPR 
FOR EACH ROW
DECLARE
NR_GRT GRT_TWR.NGRT%TYPE;
MARZA_MIN TWR.CNM2%TYPE;
aNODD ODD.NODD%TYPE;
zmienna ppr.cnmn%type;

BEGIN
  FOR W IN (
    select NODD from DMG where NDMG = :NEW.NDMG
  )
  LOOP
   aNODD := W.NODD;
   EXIT;
  END LOOP;
  IF NVL(:OLD.STAT,'O') <> 'Z' AND :NEW.STAT = 'Z' AND NVL(:NEW.OPZW,'N') <> 'T' /*AND aNODD = 1*/ THEN
    NR_GRT :=null;
    FOR W IN (
      select NGRT from grt_twr  where ntwr = :NEW.NTWR and NGRT = 326
    )
    LOOP
      NR_GRT := W.NGRT;
     EXIT;
    END LOOP;
    IF NR_GRT = 326 THEN
      MARZA_MIN := 4.5;
    ELSE
      MARZA_MIN := 12;
    END IF;
    FOR W IN (
      select GOF.NU01 from gof,twr where TWR.NTWR = :NEW.NTWR and GOF.NGOF = TWR.NGOF
    )
    LOOP
      IF W.NU01 IS NOT NULL THEN
        MARZA_MIN := W.NU01;
      END IF;
     EXIT;
    END LOOP;
    update TWR set TWR.NU03 = round((:NEW.CNZN * (1 + MARZA_MIN/100)),2) where TWR.NTWR = :NEW.NTWR;
#######################
select max(p.cnzn) into zmienna from ppr p where ilak>0;
update ppr p set cnmn=zmienna  where p.ntwr=:new.ntwr
#######################
  END IF;
END;
/
0

Jakiś pomysł?

1

Tak nawet dwa po pierwsze jeśli jesteś pracownikiem Kamsoft to zapytaj Piotra lub Przemka to Ci powiedzą jak to zrobić aby nie mutowało. Ten trigger jest dość "wrażliwy" i jak go zmaścisz to później już nie odkręcisz tak łatwo całego syfu jaki narobiłeś. Prawie 5 lat pracowałem przy tym projekcie więc wiem co mówię. Jeżeli jesteś jednym z administratorów systemu to NIE RUSZAJ bo popsujesz. Lepiej zapytaj na supporcie.
Natomiast merytorycznie trigger Ci mutuje bo masz go na tablicy PPR i robisz selecta z tej tabeli wyciągając max(p.cnzn). Natomiast merytorycznie jest na to kilka obejść jak np uruchomienie triggera w autonomicznej transakcji poprzez PRAGMA AUTONOMOUS_TRANSACTION; ale - patrz punkt 1 i 2.

0

Woolfik - dzięki ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1