[DB][Oracle10g][trigger] problem z kompilacją

[DB][Oracle10g][trigger] problem z kompilacją
id02009
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 650
0

Witam, jak w temacie mam problem z kompilacją triggera:
W tabeli pracownicy mam pola plus number, min number, pesel varchar2, dysp number
i chcę aby w polu dysp był stosunek plus/min, pomyślałem o triggerach i wyrzeźbiłem coś takiego:

Kopiuj
create or replace trigger "PRACOWNICY_T1"
AFTER
insert or update or delete on "PRACOWNICY"
DECLARE -- declare and assign values
  counted_dysp    NUMBER;
  var_p           pracownicy.plus%TYPE;
  var_m           pracownicy.min%TYPE;
  var_pes         pracownicy.pesel%TYPE;
  CURSOR kursor IS SELECT plus,min,pesel,dysp FROM pracownicy FOR UPDATE OF dysp;
BEGIN
  OPEN kursor;
 LOOP
  FETCH kursor INTO var_p,var_m,var_pes,counted_dysp;
  EXIT WHEN kursor%NOTFOUND;
  IF var_m<=0 THEN counted_dysp:=var_p;                           -- błąd 1 (mniej wiecej w tym miejscu)
  ELSE counted_dysp:=var_p/var_m;
  UPDATE pracownicy SET dysp = counted_dysp WHERE pesel=var_pes;  --błąd 2 j.w.
 END LOOP;
 CLOSE kursor;
END;

no i mam takie błędy:
#1: PLS-00103: Encountered the symbol "LOOP" when expecting one of the following: if
#2: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: end not pragma final instantiable order overriding static member constructor map

Problem w tym, że w pl/sql nie jestem (jeszcze) biegły i nie widzę błędu (naprawdę starałem się go znależć) a podpowiedzi kompilatora niewiele mi mówią.

Jeżeli ktoś widzi błąd byłbym wdzięczny za podpowiedź. Albo może ktoś zna inne rozwiązanie zagadnienia, które podałem na początku - chętnie je poznam.

Pozdrawiam serdecznie

miner
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

ja nigdy nic nie robiłem w tej bazie danych ale spróbuj usunąć średnik między if a else.

id02009
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 650
0

Niestety, pod tym względem składnia PL/SQL wygląda jak składnia C: między then a else musi być średnik (usunąłem dla pewności i oprócz dwóch powyższych błędów pojawił się trzeci) czyli nie w tym rzecz.

Ale dzięki za pomysł, bo już się bałem, że nikt tego posta nie ogląda.

Tak jak napisałem: bardzo starałem się znaleźć błąd, czyli między innymi sprawdzałem składnię i błędu nie znalazłem :-|

Oouvek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 59
0

Dawno nie robiłem nic w Oracle'u ale może przed zmienną należy postawić dwukropek - czyli np. ":var_p" ?

id02009
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 650
0

Niestety... mogę to opisać jako gehennę errorów [sciana]

Poza tym ten dwukropek, to raczej coś wspólnego z parametryzowaniem zapytań.
Tak czy siak- nie działa.
Ale dziękuję.

..i czekam, może ktoś się zlituje ;)

  • Rejestracja: dni
  • Ostatnio: dni
0
id02009 napisał(a)

Niestety... mogę to opisać jako gehennę errorów [sciana]

Poza tym ten dwukropek, to raczej coś wspólnego z parametryzowaniem zapytań.
Tak czy siak- nie działa.
Ale dziękuję.

..i czekam, może ktoś się zlituje ;)

Blok if-else jest chyba nie halo i prawdopodobnie stąd bierze się błąd numer 2.

Kopiuj
...
IF var_m<=0 THEN 
  	counted_dysp:=var_p;                      -- błąd 1 (mniej wiecej w tym miejscu)
ELSE 
  	counted_dysp:=var_p/var_m;
END IF;

Dodatkowo na końcu:

Kopiuj
...
END;
/
id02009
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 650
0

Wspaniale[!!!] Już się trigger kompiluje :D
Dziękuję za pomoc.

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.