[Oracle] ORA-00904 niepoprawny identyfikator ?

0

taki probolem przy kompilacji trigera mi wyskakuje ...
czy tutaj tylko zastosowanie kursora moze pomoc ?

CREATE OR REPLACE TRIGGER AKTUALIZUJ_STAN_MAGAZYNU
AFTER INSERT OR DELETE ON POZYCJA
DECLARE
magazyn_szt INTEGER;
kupiono_szt INTEGER;
sztuk_po_aktualizacji INTEGER;
BEGIN
IF INSERTING THEN
SELECT LICZBA_EGZEMPLARZY INTO magazyn_szt FROM KSIAZKA WHERE POZYCJA.ID_POZYCJI = KSIAZKA.ID_POZYCJI;
SELECT ILOSC_SZTUK INTO kupiono_szt FROM POZYCJA WHERE POZYCJA.ID_POZYCJI = KSIAZKA.ID_POZYCJI;
sztuk_po_aktualizacji:=magazyn_szt - kupiono_szt;
UPDATE KSIAZKA set LICZBA_EGZEMPLARZY=sztuk_po_aktualizacji;
END IF;
IF DELETING THEN
SELECT LICZBA_EGZEMPLARZY INTO magazyn_szt FROM KSIAZKA WHERE POZYCJA.ID_POZYCJI = KSIAZKA.ID_POZYCJI;
SELECT ILOSC_SZTUK INTO kupiono_szt FROM POZYCJA WHERE POZYCJA.ID_POZYCJI = KSIAZKA.ID_POZYCJI;
sztuk_po_aktualizacji:=magazyn_szt + kupiono_szt;
UPDATE KSIAZKA set LICZBA_EGZEMPLARZY=sztuk_po_aktualizacji;
END IF;
END;
/

<image>ziemniaktda.republika.pl/error.JPG </image>

0

nie pozycje.id_pozycji tylko :new.id_pozycji itd

0

CREATE OR REPLACE TRIGGER AKTUALIZUJ_STAN_MAGAZYNU
AFTER INSERT OR DELETE ON POZYCJA
DECLARE
magazyn_szt INTEGER;
kupiono_szt INTEGER;
sztuk_po_aktualizacji INTEGER;
BEGIN
IF INSERTING THEN
SELECT LICZBA_EGZEMPLARZY INTO magazyn_szt FROM KSIAZKA WHERE :new.ID_POZYCJI = KSIAZKA.ID_POZYCJI;
SELECT ILOSC_SZTUK INTO kupiono_szt FROM POZYCJA WHERE :new.ID_POZYCJI = KSIAZKA.ID_POZYCJI;
sztuk_po_aktualizacji:=magazyn_szt - kupiono_szt;
UPDATE KSIAZKA set LICZBA_EGZEMPLARZY=sztuk_po_aktualizacji;
END IF;
IF DELETING THEN
SELECT LICZBA_EGZEMPLARZY INTO magazyn_szt FROM KSIAZKA WHERE P:new.ID_POZYCJI = KSIAZKA.ID_POZYCJI;
SELECT ILOSC_SZTUK INTO kupiono_szt FROM POZYCJA WHERE :new.ID_POZYCJI = KSIAZKA.ID_POZYCJI;
sztuk_po_aktualizacji:=magazyn_szt + kupiono_szt;
UPDATE KSIAZKA set LICZBA_EGZEMPLARZY=sztuk_po_aktualizacji;
END IF;
END;

zmienilem jak zaswugerowales ale chyba nie o to chodizlo
teraz inny blad

ORA-04082: odwołania NEW lub OLD nie są dozwolone w wyzwalaczach z poziomu tabeli
04082. 00000 - "NEW or OLD references not allowed in table level triggers"

0

przed declare dodaj FOR EACH ROW - chcesz coś zrobić dla każdego wstawianego/usuwanego rekordu a triger masz wywoływany raz, niezależnie ile zapytanie zmienia rekordów - musisz tak ustawić trigera, żeby wywoływany był dla zmiany pojedyńćzego rekordu

0

nom juz na to wpadlem ale dalej jakies cuda :/ compiluje dobrze ale podczas insertowania wywala blad

wiec tak

pod tabele pozycja mam 2 triggery , (pierwszy do autoinkrementacji id)
CREATE OR REPLACE TRIGGER ID_POZYCJI_AUTOINKR
BEFORE INSERT ON POZYCJA
FOR EACH ROW
BEGIN
SELECT S_ID_POZYCJI.nextval INTO :new.ID_POZYCJI FROM dual;
END;
/
CREATE OR REPLACE TRIGGER AKTUALIZUJ_STAN_MAGAZYNU
AFTER INSERT OR DELETE ON POZYCJA
FOR EACH ROW
DECLARE
magazyn_szt INTEGER;
kupiono_szt INTEGER;
sztuk_po_aktualizacji INTEGER;
BEGIN
IF INSERTING THEN
SELECT LICZBA_EGZEMPLARZY INTO magazyn_szt FROM KSIAZKA WHERE :new.ID_POZYCJI = ID_POZYCJI;
SELECT ILOSC_SZTUK INTO kupiono_szt FROM POZYCJA WHERE :new.ID_POZYCJI = ID_POZYCJI;
sztuk_po_aktualizacji:=magazyn_szt - kupiono_szt;
UPDATE KSIAZKA set LICZBA_EGZEMPLARZY=sztuk_po_aktualizacji;
END IF;
IF DELETING THEN
SELECT LICZBA_EGZEMPLARZY INTO magazyn_szt FROM KSIAZKA WHERE :new.ID_POZYCJI = ID_POZYCJI;
SELECT ILOSC_SZTUK INTO kupiono_szt FROM POZYCJA WHERE :new.ID_POZYCJI = ID_POZYCJI;
sztuk_po_aktualizacji:=magazyn_szt + kupiono_szt;
UPDATE KSIAZKA set LICZBA_EGZEMPLARZY=sztuk_po_aktualizacji;
END IF;
END;
/

insert into POZYCJA(ID_ZAMOWIENIA,ID_KSIAZKI,ILOSC_SZTUK) values (1,1,2);

Error starting at line 1 in command:
insert into POZYCJA(ID_ZAMOWIENIA,ID_KSIAZKI,ILOSC_SZTUK) values (1,1,2)
Error report:
SQL Error: ORA-01403: nie znaleziono danych
ORA-06512: przy "S64672.AKTUALIZUJ_STAN_MAGAZYNU", linia 7
ORA-04088: błąd w trakcie wykonywania wyzwalacza 'S64672.AKTUALIZUJ_STAN_MAGAZYNU'
01403. 00000 - "no data found"

moze nalezalo by zlaczc te 2 triggery, wydaje mi sie ze trigger nie widze tego new.id_pozycji bo jako new to ono vylo traktowane przy wyzwalaniu trigera autoinkrementacji ......

0

SELECT LICZBA_EGZEMPLARZY INTO magazyn_szt FROM KSIAZKA WHERE :new.ID_POZYCJI = ID_POZYCJI

wystarczy, że nie ma takiej książki i papa

0

A czym bedzie NEW dla delete ? To tak na oko bo nie chcialo mi sie calego pzregladac.

0
reichel napisał(a)

A czym bedzie NEW dla delete ? To tak na oko bo nie chcialo mi sie calego pzregladac.

null'em :)

trzeba jednak zamienić na :old

0

eh nie rozumiem was , poza tym probowalem juz zmieniac new na old i nic to nie dalo :-|

0

Nie chcialbym tobie psuc radosci z uczenia sie, wiec polecam zapoznac sie z dokumentem

download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/triggers.htm

poczytaj kiedy wazne sa pola NEW i OLD.

1 użytkowników online, w tym zalogowanych: 0, gości: 1