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

Oracle i trigeri

[es] :: Oracle :: Oracle i trigeri

Strane: 1 2

[ Pregleda: 7562 | Odgovora: 32 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Serbiankum
Srbija

Član broj: 54947
Poruke: 240
*.adsl-a-1.sezampro.yu.

Sajt: www.drvoumomdvoristu.com


Profil

icon Oracle i trigeri13.05.2009. u 13:58 - pre 181 meseci
Ljudi nikako da u oracleu (express edition) napisem jedan triger.

Imam dve tabele koje su medjusobno povezane: Otpremnica za gorivo i stavka otpremnice za gorivo

Otpremniza za gorivo

BrojOtpr
Datum
SifraDistributera
UkupnaCena

StavkaOtpremnice za gorivo

RedniBroj
BrojOtpr
SifraGoriva
Naruceno
Istoceno
Cena


E sad, treba da napisem triger koji ce sve Cene u tabeli stavke otpremnice za gorivo sabirati i upisivati u tabelu otpremnica u polje ukupna cena. Da li je ovo izvodljivo?

NIkako da napisem valjan triger. Ako se pitate zasto je polje ukupnaCena u tabeli otpremnica to je zato sto zadatak treba da bude takav.

Svaki savet dobrodosao.

hvala

[Ovu poruku je menjao Serbiankum dana 13.05.2009. u 22:03 GMT+1]
 
Odgovor na temu

Serbiankum
Srbija

Član broj: 54947
Poruke: 240
*.adsl-a-1.sezampro.yu.

Sajt: www.drvoumomdvoristu.com


Profil

icon Re: Oracle i trigeri13.05.2009. u 16:00 - pre 181 meseci
Ljudi svaka pomoc je znacajna. Uopste nemam predstavu kako ovo da izvedem.
 
Odgovor na temu

brzak

Član broj: 66407
Poruke: 126



+5 Profil

icon Re: Oracle i trigeri13.05.2009. u 16:17 - pre 181 meseci
sve hocu da ti odgovorim, a ne stizem od guzve

evo ti nesto na brzinu, nadam se da ce pomoci

stavi na blok sa stavkama jedno summrary field (sum_cena) koje ce ti sabirati polje cena

posle mozes na when-validate-record detail bloka staviti nesto tipa :otpremnica.ukupnacena := :stavka.sum_cena
 
Odgovor na temu

Serbiankum
Srbija

Član broj: 54947
Poruke: 240
*.adsl-a-1.sezampro.yu.

Sajt: www.drvoumomdvoristu.com


Profil

icon Re: Oracle i trigeri13.05.2009. u 18:09 - pre 181 meseci
hvala na odgovoru, ali na zalost nisam bas najbolje razumeo. Moze li malo detaljnije?

Meni ta sumarna cena treba da se izracuna u polju UkupnaCena koja se nalazi u tabeli otpremnica a ne u tabeli stavkeOtpremnice. Kako bi to mogao najlakse da izvedem?

hvala
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Oracle i trigeri13.05.2009. u 18:39 - pre 181 meseci
Pomogao bih ti da ne piše u tvom profilu "Diplomirani ekonomista iz kompjuterskog inzenjeringa, master studije na fonu".

Ako pokažeš da si nešto pokušao da uradiš, pomoći ću...

Pogledaj http://download.oracle.com/doc...8/xedev_triggers.htm#sthref802
i na ovom forumu: http://www.elitesecurity.org/t363791-pomoc-oko-trigera-sql-plus
 
Odgovor na temu

Serbiankum
Srbija

Član broj: 54947
Poruke: 240
*.adsl-a-1.sezampro.yu.

Sajt: www.drvoumomdvoristu.com


Profil

icon Re: Oracle i trigeri13.05.2009. u 19:55 - pre 181 meseci
Nesto ovako sam pokusao ali ne radi:

Create or replace trigger ukupnacena
After insert of cena on STAVKEOTPRZAGORIVO
For each row
begin

select SUM (CENA)
from STAVKEOTPRZAGORIVO

insert into OTPRZAGORIVO (UKUPNACENA)

end;


E sad gde gresim?
Prvi put se susrecem sa trigerima i stvarno bi bila znacajna pomoc.

hvala
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Oracle i trigeri13.05.2009. u 20:38 - pre 181 meseci
Ima tu više grešaka.

U PL/SQL kodu nije dozvoljeno

Code:
select SUM (CENA)
from STAVKEOTPRZAGORIVO


umesto toga mora konstrukcija:

Code:
select  lista_izraza
INTO lista_varijabli
from ...


Drugo, zašto select, pa insert. Ako je tabela STAVKEOTPRZAGORIVO povezana sa tabelom OTPRZAGORIVO preko spoljnog ključa koji sadrži BrojOtpr, tada slog u OTPRZAGORIVO sa datim BrojOtpr MORA da postoji.

Treće, treba da uradiš update samo sloga koji ima BrojOtpr jednak polju BrojOtprzagorivo.

Četvrto, vrednost polja BrojOtprzagorivo u insertovanom slogu se označava kao :new.BrojOtprzagorivo

Dakle, modifikuj program da radi update, a u where klauzuli koristi BrojOtpr = :new.BrojOtprzagorivo

I, poslednje, pročitaj deo Oracle manuala gde su objašnjeni trigeri u XE bazi.
 
Odgovor na temu

Comii

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



Profil

icon Re: Oracle i trigeri13.05.2009. u 21:01 - pre 181 meseci
Ako bi postavio kod za tabele pre bi smo dosli do resenja.
Mislim da ti samo ovaj insert- triger nece biti dovoljan, jer zamisli da ti neko izbrise neki unos cene ili uradi update. Moras imati triger i za slucaj insert i update a i delete.

Evo koda koji sam ja sastavio, ali ti kazem da bi mi lakse bilo kada bih imao te tabele.

CREATE OR REPLACE TRIGGER otpremnice_gor
AFTER INSERT OR UPDATE OR DELETE OF CENA ON svake_Otpremnice
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE Otpremnica c set
c.UKUPNACENA=c.UKUPNACENA-:old.CENA;
END IF;
IF INSERTING THEN
UPDATE Otpremnica c set
c.UKUPNACENA=c.UKUPNACENA+:new.Cena;
END IF;
IF UPDATING THEN
UPDATE Otpremnica c set
c.UKUPNACENA =c.UKUPNACENA-:old.Cena+:new.Cena;
END IF;
END;


Proveri da li su imena tabela i polja koja su navedena u trigeru dobra.

[Ovu poruku je menjao Comii dana 13.05.2009. u 22:17 GMT+1]
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Oracle i trigeri13.05.2009. u 21:21 - pre 181 meseci
@Comii Pa ti si mu sve rešio. Samo što ovaj kod nikada ne bi dao tačan rezultat jer je UkupnaCena na početku (verovatno) null, pa bi i sve ostale računske radnje s njom davale null. Fali nvl svuda gde koristiš ukupnu cenu...
 
Odgovor na temu

Serbiankum
Srbija

Član broj: 54947
Poruke: 240
*.adsl-a-1.sezampro.yu.

Sajt: www.drvoumomdvoristu.com


Profil

icon Re: Oracle i trigeri13.05.2009. u 21:21 - pre 181 meseci
hvala za kod. Samo da napomenem da koristim Oracle express edition verziju.

Kod sam kompajlirao i nije pronasao nijednu gresku, ali kod nazalost ne radi. Tacnije ne sabira cene u tabeli stavkeotprzagorivo i ne upisuje vrednost u tabelu otpremnicazagorivo u polje ukupnaCena.

Okacio sam bazu na sledeci link (zauzima 15 kb)
http://rapidshare.com/files/232616241/baza.txt.html

Citam tutorijale na internetu ali nikako sam da resim ovaj triger. Hvala svima na dosadasnjoj pomoci

P.S evo uspeo sam da okacim bazu ovde na forumu umesto rapida
Prikačeni fajlovi
 
Odgovor na temu

Comii

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



Profil

icon Re: Oracle i trigeri13.05.2009. u 21:51 - pre 181 meseci
Da u pravu si djoka_l, nvl sam zaboravio.

Znaci bilo bi ovako:


CREATE OR REPLACE TRIGGER otpremnice_gor
AFTER INSERT OR UPDATE OR DELETE OF CENA ON svake_Otpremnice
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE Otpremnica c set
c.UKUPNACENA=nvl(c.UKUPNACENA,0)-:old.CENA;
END IF;
IF INSERTING THEN
UPDATE Otpremnica c set
c.UKUPNACENA=nvl(c.UKUPNACENA,0)+:new.Cena;
END IF;
IF UPDATING THEN
UPDATE Otpremnica c set
c.UKUPNACENA =nvl(c.UKUPNACENA,0)-:old.Cena+:new.Cena;
END IF;
END;


 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Oracle i trigeri13.05.2009. u 21:56 - pre 181 meseci
Code:

CREATE OR REPLACE TRIGGER otpremnice_gor
AFTER INSERT OR UPDATE OR DELETE OF CENA ON svake_Otpremnice
FOR EACH ROW
BEGIN
  IF DELETING THEN
    UPDATE Otpremnica c set
    c.UKUPNACENA=nvl(c.UKUPNACENA,0)-:old.CENA
    where c.BrojOtpremnice = :old.BrojOtpremnice;
  END IF;
  IF INSERTING THEN
    UPDATE Otpremnica c set
    c.UKUPNACENA=nvl(c.UKUPNACENA,0)+:new.Cena
    where c.BrojOtpremnice = :new.BrojOtpermnice;
  END IF;
  IF UPDATING THEN
    UPDATE Otpremnica c set
    c.UKUPNACENA =nvl(c.UKUPNACENA,0)-:old.Cena+:new.Cena
    where c.BrojOtpremnice = :old.BrojOtpremnice;
  END IF;
END;


Naravno, zaboravio sam da spomenem da fali i where uslov.
 
Odgovor na temu

Serbiankum
Srbija

Član broj: 54947
Poruke: 240
*.adsl-1.sezampro.yu.

Sajt: www.drvoumomdvoristu.com


Profil

icon Re: Oracle i trigeri13.05.2009. u 22:42 - pre 181 meseci
Ljudi hvala vam na pomoci triger radi. Evo ceo triger sa pravim imenima:

CREATE OR REPLACE TRIGGER "OTPREMNICE_GOR"
AFTER INSERT OR UPDATE OR DELETE OF CENA ON STAVKEOTPRZAGORIVO
FOR EACH ROW
BEGIN
IF DELETING THEN
UPDATE OTPRZAGORIVO c set
c.UKUPNACENA=nvl(c.UKUPNACENA,0)-:old.CENA
where c.BROJOTPRZAGORIVO = :old.BROJOTPRZAGORIVO;
END IF;
IF INSERTING THEN
UPDATE OTPRZAGORIVO c set
c.UKUPNACENA=nvl(c.UKUPNACENA,0)+:new.Cena
where c.BROJOTPRZAGORIVO = :new.BROJOTPRZAGORIVO;
END IF;
IF UPDATING THEN
UPDATE OTPRZAGORIVO c set
c.UKUPNACENA =nvl(c.UKUPNACENA,0)-:old.Cena+:new.Cena
where c.BROJOTPRZAGORIVO = :old.BROJOTPRZAGORIVO;
END IF;
END;


Posto mi je cilj da zaista razumem triger, pitao bih vas sledece:

1. Sta tacno znaci UPDATE OTPRZAGORIVO c set. Takodje sta znaci ovo "c" ? Da li je to varijabla

2. Sta znaci c.UKUPNACENA,0. Koju funkciju ima nula

3. Sta tacno znaci +:new.Cena Znam da new predstavlja novu vrednost, da li bi to trebalo da predstavlja novu vrednost cene?

4. where c.BROJOTPRZAGORIVO = :new.BROJOTPRZAGORIVO; Da li uz pomoc ovoga mi spajamo tabele Otpremnica i stavka otpremnice.

hvala
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Oracle i trigeri13.05.2009. u 22:43 - pre 181 meseci
Evo ti kompletnog koda sa uprošćenom šemom baze. Možeš da dodaš još primera da bi video kako ovo zaista i radi.

Kada god tražiš pomoć, uvek je korisno da priložiš sličan skript kao ovaj koji sam ja stavio, kako bi i drugi mogli da brzo naprave testne tabele i isprave greške u kodu.

Code:

CREATE table "OTPREMNICEGORIVA" (
    "BROJOTPREMNICE" NUMBER NOT NULL,
    "CENA"           NUMBER,
    constraint  "OTPREMNICEGORIVA_PK" primary key ("BROJOTPREMNICE")
)
/

CREATE table "STAVKEOTPREMNICEGORIVA" (
    "BROJOTPREMNICE"  NUMBER NOT NULL,
    "REDNIBROJSTAVKE" NUMBER NOT NULL,
    "CENA"            NUMBER
)
/

alter table "STAVKEOTPREMNICEGORIVA" add constraint 
"STAVKEOTPREMNICEGORIVA_PK" primary key ("BROJOTPREMNICE","REDNIBROJSTAVKE")
/

ALTER TABLE "STAVKEOTPREMNICEGORIVA" ADD CONSTRAINT "STAVKEOTPREMNICEGORIVA_FK" 
FOREIGN KEY ("BROJOTPREMNICE")
REFERENCES "OTPREMNICEGORIVA" ("BROJOTPREMNICE")

/
create or replace trigger "STAVKEOTPREMNICEGORIVA_T1"
AFTER
insert or update or delete on "STAVKEOTPREMNICEGORIVA"
for each row
begin
  IF DELETING THEN
    UPDATE OtpremniceGoriva c set
    c.CENA=nvl(c.CENA,0)-nvl(:old.CENA,0)
    where c.BrojOtpremnice = :old.BrojOtpremnice;
  END IF;
  IF INSERTING THEN
    UPDATE OtpremniceGoriva c set
    c.CENA=nvl(c.CENA,0)+nvl(:new.Cena,0)
    where c.BrojOtpremnice = :new.BrojOtpremnice;
  END IF;
  IF UPDATING THEN
    UPDATE OtpremniceGoriva c set
    c.CENA =nvl(c.CENA,0)-nvl(:old.Cena,0)+nvl(:new.Cena,0)
    where c.BrojOtpremnice = :old.BrojOtpremnice;
  END IF;

end;
/   
insert into otpremnicegoriva (BrojOtpremnice,cena) values (1, null);
insert into otpremnicegoriva (BrojOtpremnice,cena) values (2,0);

select * from otpremnicegoriva;

insert into stavkeotpremnicegoriva (brojotpremnice,rednibrojstavke,cena) values (1,1,22);

select * from otpremnicegoriva;
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Oracle i trigeri13.05.2009. u 22:49 - pre 181 meseci
U isto vreme postujemo...

Citat:
1. Sta tacno znaci UPDATE OTPRZAGORIVO c set. Takodje sta znaci ovo "c" ? Da li je to varijabla

2. Sta znaci c.UKUPNACENA,0. Koju funkciju ima nula

3. Sta tacno znaci +:new.Cena Znam da new predstavlja novu vrednost, da li bi to trebalo da predstavlja novu vrednost cene?

4. where c.BROJOTPRZAGORIVO = :new.BROJOTPRZAGORIVO; Da li uz pomoc ovoga mi spajamo tabele Otpremnica i stavka otpremnice.


1. c je alias za naziv tabele. Set je deo sintakse UPDATE komande. Da bi specificirao u nekom upitu koji u sebi ima više tabela kolonu, moraš da koristiš oblik ime_tabele.ime_kolone ili alias.ime_kolone ili samo ime_kolone, ali samo u slučaju da više tabela iz upita nemaju kolonu sa istim imenom.

2. nije c.UKUPNACENA,0 nego NVL(c.UKUPNACENA,0). NVL je funkcija koja vraća vrednost prvog argumenta ukoliko je on različit od null ili drugog, ako je prvi null.

3. :new.ime_kolone je vredost kolone koja je "nova". Definisana je u slučaju ON INSERT i ON UPDATE trigera. :old.ime_kolone je "stara" vrednost kolone i definisana je u ON DELETE i ON UPDATE trigeru.

4. da
 
Odgovor na temu

Serbiankum
Srbija

Član broj: 54947
Poruke: 240
*.adsl-a-1.sezampro.yu.

Sajt: www.drvoumomdvoristu.com


Profil

icon Re: Oracle i trigeri13.05.2009. u 23:15 - pre 181 meseci
1. znaci c.UKUPNACENA je isto sto i otprzagorivo.ukupnacena

2. nvl je ustvari univerzalna funkcija.radi i ako je razlici od nule ili ako je null, Sta znaci ova nula u zagradi NVL(c.UKUPNACENA,0).

3. Zanima me tacno kako ovo funkcionise: c.UKUPNACENA=nvl(c.UKUPNACENA,0)+:new.Cena Kako izracunava? Da li smo ovde mogli da stavimo SUM nesto kao SUM(cena) ?

4. where c.BROJOTPRZAGORIVO = :old.BROJOTPRZAGORIVO; Posto ovde c znaci otprzagorivo = old. Da li ovo old predstavlja stavkuotprzagorivo tabelu ili neku staru vrednost?

hvala

 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Oracle i trigeri13.05.2009. u 23:30 - pre 181 meseci
1. da - alias je neobavezni deo sintakse koji se koristi za skraćeno pisanje
2. nvl je funkicja sa dva argumenta: nvl(arg1, arg2) = arg1 ako je arg1 različit od null, inače arg2. To je kao da napišeš
IF arg1 not null then return arg1 else return arg2 end if; nvl(arg1,0) znači da će funkcija vratiti vrednost 0 (nula) ako je arg1 null. null je ništa - nije broj. 1 + 0 = 1, 1 + null = null
3. nema smisla stavljati sum, zato što se triger "ispaljuje" POSLE SVAKOG INSERTOVANOG SLOGA (after insert ... for each row). Zašto bi, na primer, posle inserta hiljadu prvog sloga stavke ponovo dohvatao svih 1001 stavki da računaš sum.
4. TRIGER se definiše nad TABELOM. :old. i :new. se odnose na vrednosti u slogu tabele nad kojim je definisan triger. Shvati to kao da triger ima dva implicitna objekta (kod UPDATE) ili jedan (kod INSERT i DELETE) koji predstavljaju slogove tabele koji su prouzrokovali da triger "opali"
 
Odgovor na temu

Serbiankum
Srbija

Član broj: 54947
Poruke: 240
*.adsl-a-1.sezampro.yu.

Sajt: www.drvoumomdvoristu.com


Profil

icon Re: Oracle i trigeri16.05.2009. u 09:35 - pre 181 meseci
Pokusavam da napravim sledeci triger:

Imamo tabelu distributer (SifraDistributera i NazivDistributera) i tabelu Otpremicazagorivo (BrojOtpr,datum,SifraDistributera,NazivDistributera). Triger treba da omoguci da ako u tabeli otpremnicazagorivo upisemo SifruDistributera da se u polju NazivDistributera ispise njegov naziv.

U prethodnih par postova imate bazu koju sam okacio.

Ideja je sledeca:

Code:

CREATE OR REPLACE TRIGGER "Triger" 
AFTER INSERT or update OF sifradistributera ON otprzagorivo
FOR EACH ROW
BEGIN
  
  IF INSERTING THEN
    UPDATE OTPRZAGORIVO c set
    c.nazivdistributera = :old.nazivdistributera
    where c.sifradistributera = :new.sifradistributera;
  END IF;
END;


Triger kad se kompajlira ne prikazuje gresku ali prilikom testiranja javlja gresku "mutating"
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Oracle i trigeri16.05.2009. u 11:08 - pre 181 meseci
Spomenuo si tsbelu (šifarnik) distributera a nje nema u kodu...
Kako bi našao naziv distributera, ako imaš njegovu šifru?

Code:

begin
   select nazivdistributera
   into :new.nazivdistributera
   from distributer d
   where d.sifradistributera = :new.sifradistributera;
endč


A i loš ti je običaja da trigeru daš naziv "Triger" , bolje bi bilo da se zove, na primer, otprzagorivo_t1.
 
Odgovor na temu

Comii

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



Profil

icon Re: Oracle i trigeri16.05.2009. u 11:08 - pre 181 meseci
Pokušaj nešto ovako da ubacis u telo trigera:


UPDATE OTPRZAGORIVO c set
c.nazivdistributera=DISTRIBUTER.nazivdistributera
where DISTRIBUTER.sifradistributera = :new.sifradistributera;
 
Odgovor na temu

[es] :: Oracle :: Oracle i trigeri

Strane: 1 2

[ Pregleda: 7562 | Odgovora: 32 ] > FB > Twit

Postavi temu Odgovori

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