PDA

View Full Version : [SQL]Oracle 10 express trigger


antony85
19-02-2009, 11:12
Salve,ho utilizzato il seguente trigger in oracle 10 xe:
la tabella è composta:za(a(number),b(number),c(number))

create or replace trigger tr1
after insert on za
for each row
declare
x number(3):=5;
y number(3):=6;
z number(4):=x+y;
begin
insert into za(c) values(z);
end;

il trigger viene compilato,ma all'atto del suo richiamo durante l'inserimento dei valori nella tabella,viene emesso il seguente messaggio d'errore...cm risolvo?

error ORA-04091: La tabella ADMIN.ZA è in fase di modifica, il trigger/funzione non può leggerla ORA-06512: a "ADMIN.TR1", line 6 ORA-04088: errore durante esecuzione del trigger 'ADMIN.TR1'

gugoXX
19-02-2009, 11:30
Secondo me ti e' vietato perche' Oracle si e' accorto che entreresti in ricorsione.
Il trigger verrebbe richiamato dal trigger stesso, o sbaglio?

PS: Non e' che avresti voluto creare un trigger "Instead of Insert" invece di un "After insert"
Comunque per soluzioni simili a queste esistono le function column, ovvero colonne che mappano direttamente una funzione (scalare) di altre colonne della tabella stessa, eventualmente materializzate (e/o indicizzate) per questioni di performance.

antony85
19-02-2009, 11:33
nn credo il problema sia la ricorsione,io ho solo bisogno di un trigger,ke al momento dell'inserimento di due valori in due attributi diversi,generi la somma dei due valori e la inserisca in un terzo attributo...qst cosa va fatta x ogni riga..

gugoXX
19-02-2009, 11:37
nn credo il problema sia la ricorsione,io ho solo bisogno di un trigger,ke al momento dell'inserimento di due valori in due attributi diversi,generi la somma dei due valori e la inserisca in un terzo attributo...qst cosa va fatta x ogni riga..

Avevo capito. Ma quando nel codice del tuo trigger scrivi
INSERT INTO za ...
di fatto stai inserendo una nuova riga... il che scatenera' di nuovo il trigger stesso, etc.

da cosa ho capito tu vorresti veramente usare un Trigger Instead of Insert.
Il quale inserira' la riga (che essendo instead of non e' ancora stata inserita), aggiungendo anche il terzo parametro.

Ti invito comunque a studiare le column function, dato che sono la soluzione migliore per questo tuo problema specifico.

antony85
21-02-2009, 11:41
raga ho risolto cosi ^^
CREATE OR REPLACE TRIGGER tr1
before INSERT ON za
FOR EACH ROW
BEGIN
:NEW.c:=:NEW.a+:NEW.b;
END;