prosze o pomoc z before insert , after insert

0

chodzi o trigger ktory bez uzycia sekwencji bedze generowal ID na podstawie 2 litery rekordu RODZAJ_OKLADKI + rekord ILOSC STRON

tak wyglada tabela

/==============================================================/
/* Table: OPRAWA /
/
==============================================================*/
create table OPRAWA (
ID_OPRAWY VARCHAR2(8) not null,
RODZAJ_OKLADKI VARCHAR2(20) not null,
ILOSC_STRON VARCHAR2(10) not null,
constraint PK_OPRAWA primary key (ID_OPRAWY)
);

dajmy na to insert

insert into OPRAWA(RODZAJ_OKLADKI,ILOSC_STRON) values('twarda','1xx');

moj trigger ma wstawic w pole ID_OPRAWY 'tw1xx'

CREATE OR REPLACE TRIGGER oprawa_nowyid
AFTER INSERT
ON OPRAWA
FOR EACH ROW
DECLARE
nowy_id varchar2(8);
BEGIN
SELECT substr( :new.RODZAJ_OKLADKI,0,2 )||:new.ILOSC_STRON INTO nowy_id FROM OPRAWA;
UPDATE OPRAWA SET ID_OPRAWY = nowy_id WHERE ID_OPRAWY = :new.ID_OPRAWY;
END;

kombinuje nad tym od 3 dni
teraz wyskakuje jakis blad z mutacja , naprawde nie mam juz pomyslu ..

dlatego prosze o pomoc

0

nikt nic nie porad :-| zi ?

0

a ja bym ci polecił zrezygnować z triggerów...

skąd dorwałeś serwer, który obsługuje triggery?

0

a ja bym ci polecił zrezygnować z triggerów...

skąd dorwałeś serwer, który obsługuje triggery?

Temu panu dziękujemy...

Zjawisko tabel mutujących dotyczy wyzwalaczy DML na poziomie wiersza. Nie możesz odwoływać się kwerendą do tabeli, którą modyfikujesz (tak w skrócie). Rozwiązań problemu tabeli mutującej jest kilka:

  1. Wyzwalacz INSTEAD OF na widoku zamiast wyzwalacza DML na tabeli
  2. Dwa wyzwalacze (na poziomie wiersza i na poziomie instrukcji), które wymieniają się informacjami poprzez składowe pakietu (które z natury rzeczy są globalne)
  3. Identyfikatory :old i :new zamiast zapytania.

Rozwiązanie Twojego problemu:

CREATE OR REPLACE TRIGGER oprawa_nowyid
BEFORE INSERT
ON OPRAWA
FOR EACH ROW
BEGIN
 :new.ID_OPRAWY := SUBSTR(:new.RODZAJ_OKLADKI,1,2) || TO_CHAR(:new.ILOSC_STRON);
END;
0

pierwsza wersja tego trigera to byloc wlasnie cos w ten desen ale nie dziallo mi tez wiec zaczalem kombinowac z selectami

bardzo dziekuje za pomoc :-)

0

a przy okazji mam kolejny problem, 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;
/

user image

0

Spróbuj tak:

SELECT LICZBA_EGZEMPLARZY INTO magazyn_szt FROM KSIAZKA, POZYCJA WHERE POZYCJA.ID_POZYCJI = KSIAZKA.ID_POZYCJI;

nie dodales POZYCJA do klauzuli FROM

Musisz posprawdzac calego triggera bo sa bledy.

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