Oracle7 triggers question.
Date: 20 Feb 1993 00:27:37 GMT
Message-ID: <1m3ttpINN6kn_at_skeena.ucs.ubc.ca>
I'm just trying to put together a small application where I can make use of the database triggers. My question is:
How can I reference the :old.colname, and :new.colname so that the colnames are not used explicitly. Can I used something like NAME_IN packaged function found in forms3?
The following is a descripion of the tables:
SQL> describe medication;
Name Null? Type ------------------------------- -------- ---- MED_CODE NOT NULL NUMBER(2) MED_NAME VARCHAR2(24) SQL> describe audit_tbl; Name Null? Type ------------------------------- -------- ---- MODDATE DATE MODCODE VARCHAR2(1) TABLENAME VARCHAR2(12) FIELDNAME VARCHAR2(12) OLDVALUE VARCHAR2(255) NEWVALUE VARCHAR2(255) USERID VARCHAR2(10)
The following statement creates trigger to capture all updates done on the 'medication' table and stores that in the 'audit_tbl':
CREATE OR REPLACE TRIGGER change_audit_med
AFTER UPDATE ON medication
FOR EACH ROW BEGIN
IF UPDATING ('med_code') THEN
INSERT INTO audit_tbl
VALUES (SYSDATE,'M','MEDICATION','MED_CODE',:old.med_name,
:new.med_name,USER);
END IF; IF UPDATING ('med_name') THEN
INSERT INTO audit_tbl
VALUES (SYSDATE,'M','MEDICATION','MED_NAME',:old.med_name,
:new.med_name,USER);
END IF; END; I would like to replace the above triger with something like this:
CREATE OR REPLACE TRIGGER change_audit_med AFTER UPDATE ON medication FOR EACH ROW DECLARE CURSOR COL_LIST IS SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='MEDICATION' AND OWNER='MIREK7'; OLD_VAL varchar2(100); NEW_VAL varchar2(100); COL_NM varchar2(100); BEGIN FOR COL_INST IN COL_LIST LOOP COL_NM := COL_INST.COLUMN_NAME; IF UPDATING (COL_NM) THEN OLD_VAL := 'OLD.'||COL_NM; NEW_VAL := 'NEW.'||COL_NM; INSERT INTO audit_tbl VALUES (SYSDATE,'M','MEDICATION',COL_NM, NAME_IN(OLD_VAL),NAME_IN(NEW_VAL),USER); ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ END IF; END LOOP;
END; That way the trigger would be more general, and also wouldn't depent on the number of columns in the 'medication' table.
Any comments would be appreciated,
Thanks,
Mirek Piaseczny
University of British Columbia
mirek_at_unixg.ubc.ca
Received on Sat Feb 20 1993 - 01:27:37 CET