Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

pomoc oko trigera u sql plus-u

[es] :: Baze podataka :: pomoc oko trigera u sql plus-u

[ Pregleda: 4266 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

zeroberto
Novi Sad

Član broj: 160819
Poruke: 14



Profil

icon pomoc oko trigera u sql plus-u12.05.2009. u 12:42 - pre 182 meseci
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?
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: pomoc oko trigera u sql plus-u12.05.2009. u 12:54 - pre 182 meseci
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.
 
Odgovor na temu

Comii

Član broj: 180123
Poruke: 49
*.dynamic.sbb.rs.



Profil

icon Re: pomoc oko trigera u sql plus-u12.05.2009. u 15:03 - pre 182 meseci
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;
 
Odgovor na temu

zeroberto
Novi Sad

Član broj: 160819
Poruke: 14



Profil

icon Re: pomoc oko trigera u sql plus-u12.05.2009. u 16:41 - pre 182 meseci
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]
 
Odgovor na temu

zeroberto
Novi Sad

Član broj: 160819
Poruke: 14



Profil

icon Re: pomoc oko trigera u sql plus-u13.05.2009. u 08:43 - pre 182 meseci
Ok, radi.
Stavio sam DECLARE CURSOR promenljiva is SELECT sifrad FROM radnik WHERE funk<>1;
i :NEW.sifno = promenljiva_1.sifrad
 
Odgovor na temu

[es] :: Baze podataka :: pomoc oko trigera u sql plus-u

[ Pregleda: 4266 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.