Oracle: Vrijednosti :NEW i :OLD varijabli pri okidanju triggera
Wednesday, 28.02.2007 – DejanEvo bas sam danas jednom kolegi programeru objasnjavao statuse :NEW i :OLD varijabli pri odredjenom trigger fire-eventu (mozebitni prevod: okidacki dogadjaj?) . Za tu svrhu sam koristio jedan najobicniji primjer, koji cu pokazati i ovdje.
Najprije moramo napraviti tabelu i unijeti testne podatke:
CREATE TABLE test_table(id NUMBER, tekst VARCHAR2(32));
INSERT INTO test_table VALUES(1, 'tekst1');
INSERT INTO test_table VALUES(2, 'tekst2');
INSERT INTO test_table VALUES(3, 'tekst3');
INSERT INTO test_table VALUES(4, 'tekst4');
INSERT INTO test_table VALUES(5, 'tekst5');
SELECT * FROM test_table;
ID TEKST
-- ------
1 tekst1
2 tekst2
3 tekst3
4 tekst4
5 tekst5
Nakon toga kreiramo trigger:
CREATE OR REPLACE TRIGGER tr_old_new
BEFORE UPDATE OR INSERT OR DELETE ON test_table
FOR EACH ROW
BEGIN
IF UPDATING THEN
dbms_output.put_line('Updating: ');
dbms_output.put_line('old id: '||:OLD.id);
dbms_output.put_line('new id: '||:NEW.id);
dbms_output.put_line('old tekst: '||:OLD.tekst);
dbms_output.put_line('new tekst: '||:NEW.tekst);
END IF; IF INSERTING THEN
dbms_output.put_line('Inserting: ');
dbms_output.put_line('old id: '||:OLD.id);
dbms_output.put_line('new id: '||:NEW.id);
dbms_output.put_line('old tekst: '||:OLD.tekst);
dbms_output.put_line('new tekst: '||:NEW.tekst);
END IF; IF DELETING THEN
dbms_output.put_line('Deleting: ');
dbms_output.put_line('old id: '||:OLD.id);
dbms_output.put_line('new id: '||:NEW.id);
dbms_output.put_line('old tekst: '||:OLD.tekst);
dbms_output.put_line('new tekst: '||:NEW.tekst);
END IF;EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END tr_old_new;
/
Nakon sto smo uspjesno kreirali tabelu i trigger, mozemo napraviti test za svaki fire-event: UPDATE, INSERT i DELETE. Ne zaboravite aktivirati DBMS Output (u sqlplusu akvitirajte ovako “set serveroutput on“, a za alat, koji vec koristite znate vec i sami kako da aktivirate DBMS output. 🙂 ).
INSERT INTO test_table VALUES(6, 'tekst6');
Trebalo bi se ispisati slijedece:
Inserting:
old id:
new id: 6
old tekst:
new tekst: tekst6
UPDATE test_table SET id = 7 WHERE id = 6;
Trebalo bi se ispisati slijedece:
Updating:
old id: 6
new id: 7
old tekst: tekst6
new tekst: tekst6
DELETE FROM test_table WHERE id = 7;
Trebalo bi se ispisati slijedece:
Deleting:
old id: 7
new id:
old tekst: tekst6
new tekst:
Mislim da je iz samog ispisa vidljivo koje vrijednosti sadrze :NEW i :OLD varijable prilikom okidanja triggera.