Trigger - mutowanie

GZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
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?

Kopiuj
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;
/
GZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Jakiś pomysł?

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
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.

GZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Woolfik - dzięki ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.