I am trying to Insert new row in Table StavkaUgovora (ContractItem) and trigger/procedure should calculate (+/-) jedinicna_cena (price) and kolicina (amount) into the ukupna_cena (total_price) at table Ugovor(contract). I already have update and delete and that works fine, but for inserting statement script go into the loop and multiplicate data without stopping. Where i wrong?
CREATE TABLE StavkaUgovora (
broj_stavke INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
broj_ugovora INT not null,
kolicina NUMBER,
tip_usluge VARCHAR2(255),
jedinicna_cena NUMBER,
CONSTRAINT stavka_ugovora_broj_ugovora
FOREIGN KEY(broj_ugovora)
REFERENCES Ugovor(broj_ugovora));
CREATE TABLE Ugovor (
broj_ugovora INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
broj_ponude INT not null,
datum_sklapanja DATE,
ukupna_cena NUMBER,
CONSTRAINT broj_ponude_ugovor
FOREIGN KEY(broj_ponude)
REFERENCES Ponuda(broj_ponude)
);
CREATE OR REPLACE PROCEDURE Zbir (brojUgovoraIN NUMBER, cenaSaberiIN NUMBER, cenaOduzmiIN
NUMBER)
AS suma UGOVOR.broj_ugovora%type;
pragma autonomous_transaction;
BEGIN suma:=0;
EXECUTE IMMEDIATE 'ALTER TRIGGER ZABRANAIZMENEUKUPNECENE DISABLE';
SELECT ukupna_cena INTO suma
FROM UGOVOR
WHERE broj_ugovora=brojUgovoraIN;
UPDATE UGOVOR
SET ukupna_cena=suma + cenaSaberiIN - cenaOduzmiIN
WHERE broj_ugovora=brojUgovoraIN;
EXECUTE IMMEDIATE 'ALTER TRIGGER ZABRANAIZMENEUKUPNECENE ENABLE';
COMMIT;
END;
CREATE OR REPLACE TRIGGER "SIFRAUGOVORA"
BEFORE INSERT OR UPDATE OR DELETE ON STAVKAUGOVORA
FOR EACH ROW
DECLARE
brojUgovora NUMBER;
cenaSaberi NUMBER;
cenaOduzmi NUMBER;
BEGIN
IF INSERTING
THEN
BEGIN
brojUgovora := :NEW.broj_ugovora;
cenaSaberi := :NEW.jedinicna_cena * :NEW.kolicina;
cenaOduzmi := 0;
END;
ELSIF UPDATING
THEN
BEGIN
brojUgovora := :NEW.broj_ugovora;
cenaSaberi := :NEW.jedinicna_cena * :NEW.kolicina;
cenaOduzmi := :OLD.jedinicna_cena * :OLD.kolicina;
END;
ELSE
BEGIN
brojUgovora := :OLD.broj_ugovora;
cenaSaberi := 0;
cenaOduzmi := :OLD.jedinicna_cena * :OLD.kolicina;
END;
END IF;
BEGIN
Zbir(brojUgovora, cenaSaberi, cenaOduzmi);
END;
END;