» »

SQL trigger Oracle

SQL trigger Oracle

PunXXX ::

Imam tabelo diplomska_dela, hočem narediti prožilec, ki bo po dodajanju novega vnosa v tabelo diplomska_dela preveril atribut datum_zagovora in izpisal, ali bo diplomsko delo zagovorjeno v prihodnosti na današnji datum oz. je bilo zagovorjeno v preteklosti.
Trigger sem ustvaril brez problemov. Vendar po klicanju insert stavka pride do sledeče napake:

ERROR at line 1:
ORA-04091: table STUDENT073.DIPLOMSKA_DELA is mutating, trigger/function may
not see it
ORA-06512: at "STUDENT073.Preveri_Datum_Diplome", line 7
ORA-04088: error during execution of trigger
'STUDENT073.Preveri_Datum_Diplome'

Potem sem v trigger dodal vrstico pragma autonomous_transaction; kar je pomagalo glede zgornje napake.
Ponovno sem napisal insert stavek in pokazala se je nova napaka:
ERROR at line 1:
ORA-04098: trigger 'STUDENT073.DIPLOMEIDPOVECANJE' is invalid and failed
re-validation
in pa no data in table diplomska_dela.

Prosim lepo za pomoč.

Tabela:

REM CREATE TABLE DIPLOMSKA_DELA
REM (ID_DD INTEGER NOT NULL
REM ,NASLOV VARCHAR2(150) NOT NULL
REM ,DATUM_ZAGOVORA DATE NOT NULL
REM ,POTRJEN_NASLOV VARCHAR2(2) NOT NULL
REM ,STU_ID_STUDENTA INTEGER NOT NULL
REM ,PRE_ID_PREDMETA INTEGER NOT NULL

Trigger:

CREATE OR REPLACE TRIGGER je_diploma_zagovorjena AFTER INSERT ON diplomska_dela
FOR EACH ROW
DECLARE
pragma autonomous_transaction;
preveri_datum DATE;

BEGIN
IF inserting THEN

--preberem DATUM iz tabele DIPLOMSKA DELA:
SELECT datum_zagovora INTO preveri_datum FROM diplomska_dela WHERE ID_DD=:new.ID_DD;

IF(new.preveri_datum < SYSDATE)
DBMS_OUTPUT.PUT_LINE('Diplomska naloga je bila ze zagovorjena'||preveri_datum);
END IF;

IF(new.preveri_datum = SYSDATE)
DBMS_OUTPUT.PUT_LINE ('Diplomska naloga bo danes zagovorjena'||preveri_datum);
END IF;

IF(new.preveri_datum > SYSDATE)
DBMS_OUTPUT.PUT_LINE ('Diplomska naloga še ni bila zagovorjena'||preveri_datum);
END IF;

END IF;
END;
/

JanezH ::

JanezH ::

takole pa deluje:

CREATE OR REPLACE TRIGGER je_diploma_zagovorjena AFTER INSERT ON diplomska_dela
FOR EACH ROW
DECLARE
--pragma autonomous_transaction;
--preveri_datum DATE;

BEGIN
IF inserting THEN

--prebe DATUM iz tabele DIPLOMSKA DELA:
--SELECT datum_zagovora INTO preveri_datum FROM diplomska_dela WHERE ID_DD=:new.ID_DD;

IF(:new.datum_zagovora < trunc(SYSDATE)) then
DBMS_OUTPUT.PUT_LINE('Diplomska naloga je bila ze zagovorjena '|| :new.datum_zagovora);
END IF;

IF(:new.datum_zagovora = trunc(SYSDATE)) then
DBMS_OUTPUT.PUT_LINE ('Diplomska naloga bo danes zagovorjena '||:new.datum_zagovora);
END IF;

IF(:new.datum_zagovora > trunc(SYSDATE)) then
DBMS_OUTPUT.PUT_LINE ('Diplomska naloga še ni bila zagovorjena '||:new.datum_zagovora);
END IF;

END IF;
END;


in še za test:
insert into diplomska_dela values (1, 'aaa', '31.12.2010', 'ne', 1, 1);
commit;
insert into diplomska_dela values (1, 'aaa', '22.12.2010', 'ne', 1, 1);
commit;
insert into diplomska_dela values (1, 'aaa', '11.12.2010', 'ne', 1, 1);
commit;

PunXXX ::

Najlepša hvala za pomoč.

Sedaj mi ne javi več nobene napake vendar mi po vnosu ničesar ne izpiše (npr. diplomska naloga je bila že zagovorjena 23.2.2010)?

SQL> insert into diplomska_dela values (9, 'akakaka', '23.2.2010', 'ne', 2,2);

1 row created.

SQL>

JanezH ::

Ti izpiše. Poglej pod Output.

PunXXX ::

Res je, pozabil sem vklopiti serveroutput. Hvala še 1x ;)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

PL SQL problem

Oddelek: Programiranje
15907 (476) killa bee
»

oracle 12 identity (the old way)

Oddelek: Programiranje
61046 (851) detroit
»

[ORACLE][Novinec]Resitev napake PLS-00428

Oddelek: Programiranje
5696 (606) smejko
»

Oracle - kako sprožiti funkcijo vsak dan ob isti uri

Oddelek: Programiranje
5994 (946) majlo
»

SQL problem

Oddelek: Programiranje
111328 (1175) JanezH

Več podobnih tem