Forum » Programiranje » 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;
/
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 ::
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;
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>
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>
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | PL SQL problemOddelek: Programiranje | 917 (486) | killa bee |
» | oracle 12 identity (the old way)Oddelek: Programiranje | 1056 (861) | detroit |
» | [ORACLE][Novinec]Resitev napake PLS-00428Oddelek: Programiranje | 709 (619) | smejko |
» | Oracle - kako sprožiti funkcijo vsak dan ob isti uriOddelek: Programiranje | 1010 (962) | majlo |
» | SQL problemOddelek: Programiranje | 1340 (1187) | JanezH |