[ zeroberto @ 12.05.2009. 12:42 ] @
Triger treba da zabrani unos sifre radnika u tabelu clanak ako obelezje funk u radnik nije 1.
Sifno je obelezje u tabeli clanak koje je references na radnik(sifrad).
Code:

CREATE OR REPLACE TRIGGER radnik_trigger
BEFORE INSERT OR UPDATE OF sifno ON clanak
FOR EACH ROW
BEGIN
  IF
    :NEW.sifno NOT IN (SELECT sifrad FROM radnik WHERE funk=1)
  THEN
    RAISE_APPLICATION_ERROR (-20001, 'Greska! Unos nije moguc');
  END IF;
END;

Greska je sledeca:
Code:

LINE/COL ERROR
-------- -----------------------------------------------
2/3      PL/SQL: Statement ignored
3/23     PLS-00405: subquery not allowed in this context

Da li moze ovo nekako drugacije da se resi?
[ djoka_l @ 12.05.2009. 12:54 ] @
Code:
:NEW.sifno NOT IN (SELECT sifrad FROM radnik WHERE funk=1)


Ovo, na prvi pogled, pravi problem. Ne može da se koristi na ovakav način NOT IN.
Moglo bi, na primer
Code:


Radnici number;
begin
  select count(*)
  into Radnici
  from radnik
  where sifrad = :NEW.sifno
     and funk=1;

  if Radnici > 0 then ...
  else raise_applicaton_error...
  end if;
end;


Nisam probao, ali ovako nešto bi trebalo da radi.
[ Comii @ 12.05.2009. 15:03 ] @
Mislim da će ovo proći:

SELECT sifrad FROM radnik WHERE funk=1 -- ove vrednosti smesti u kursorsku promeljivu pa će triger izgledati ovako:


CREATE OR REPLACE TRIGGER radnik_trigger
BEFORE INSERT OR UPDATE OF sifno ON clanak
FOR EACH ROW
DECLARE
CURSOR promenljiva is SELECT sifrad FROM radnik WHERE funk=1;
BEGIN
FOR promenljiva_1 in promenljiva LOOP
IF
:NEW.sifno <> promenljiva_1.sifrad
THEN
RAISE_APPLICATION_ERROR (-20001, 'Greska! Unos nije moguc');
END IF;
END LOOP;
END;
[ zeroberto @ 12.05.2009. 16:41 ] @
Hvala na odgovorima. Ja sam mislio da će ovo biti nešto jednostavno, ali izgleda da nije (za nekog naprednijeg pocetnika :) ).
Za sada sam probao samo Comiijevo rešenje, međutim sad ne dopušta ništa da unesem.
Code:

  1  insert into clanak (sifc,nazc,sifno,sifrub,sifbr)
  2* values (kljuc_cla.nextval,'naziv',106,11,100001)
values (kljuc_cla.nextval,'naziv',106,11,100001)
        *
ERROR at line 2:
ORA-20001: Greska! Unos nije moguc
ORA-06512: at "BAZA1.RADNIK_TRIGGER", line 8
ORA-04088: error during execution of trigger 'BAZA1.RADNIK_TRIGGER'


A sifno=106 odnosno sifrad=106 postoji u radnik
Code:

select funk from radnik where sifrad=106;

      FUNK
----------
         1


Ako kod :NEW.sifno <> promenljiva_1.sifrad stavim = umesto <> tada će dozvoliti unos svima sem funk=1, međutim sa <> ne dozvoljava nikakav unos.

[Ovu poruku je menjao zeroberto dana 13.05.2009. u 08:00 GMT+1]
[ zeroberto @ 13.05.2009. 08:43 ] @
Ok, radi.
Stavio sam DECLARE CURSOR promenljiva is SELECT sifrad FROM radnik WHERE funk<>1;
i :NEW.sifno = promenljiva_1.sifrad