BEGIN DBMS_OUTPUT.PUT_LINE(’create OR REPLACE TRIGGER ’ || GENERATE_TRIG_NAME(p_Table_Name)); DBMS_OUTPUT.PUT_LINE(’ AFTER update ON ’ || p_Table_Name); DBMS_OUTPUT.PUT_LINE(’ FOR EACH ROW’); DBMS_OUTPUT.PUT_LINE(’DECLARE ’); DBMS_OUTPUT.PUT_LINE(’ vTABLE_NAME VARchar2(30) := ’ || v_SINGLE_QUOTE || p_Table_Name || v_SINGLE_QUOTE || ’;’); -- 创建 Key_Value DBMS_OUTPUT.PUT_LINE(’ vKEY_VALUE VARchar2(100) ’); FOR c1rec IN c1(p_Table_Name) LOOP IF c1rec.POSITION = C1rec.LAST_POSITION THEN vSep:=’;’; ELSE vSep:=’||’’~’’|| ’; END IF; IF c1rec.data_type = ’DATE’ THEN DBMS_OUTPUT.PUT_LINE(’ to_char(:new.’||c1rec.column_name||’,’’MM-DD-YYYY’’)’ || vSep ); ELSIF c1rec.data_type = ’NUMBER’ THEN DBMS_OUTPUT.PUT_LINE(’ to_char(:new.’||c1rec.column_name||’)’ || vSep ); ELSE DBMS_OUTPUT.PUT_LINE(’ :new.’||c1rec.column_name || vSep ); END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(’ vACTION_DATE DATE := SYSDATE’); DBMS_OUTPUT.PUT_LINE(’ vUSER_NAME VARchar2(30) := USER’); DBMS_OUTPUT.PUT_LINE(’BEGIN’); FOR c2rec IN c2(p_Table_Name) LOOP IF c2rec.column_id > 1 THEN BEGIN DBMS_OUTPUT.PUT_LINE(’ log_change_info (vTABLE_NAME, vKEY_VALUE, vACTION_DATE, vUSER_NAME, ’ ); DBMS_OUTPUT.PUT_LINE(’ ’||v_SINGLE_QUOTE||c2rec.COLUMN_NAME||v_SINGLE_QUOTE||’, :old.’||c2rec.COLUMN_NAME||’, :new.’||c2rec.COLUMN_NAME||’);’ ); EXCEPTION WHEN OTHERS THEN dbms_output.put_line(’**** ’); dbms_output.put_line(’**** Error formatting column: ’||c2rec.column_ID); dbms_output.put_line(’**** ’); END; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(’end;’); DBMS_OUTPUT.PUT_LINE(’/’); --EXCEPTION -- WHEN OTHERS THEN -- NULL; END create_AUDIT_TRIG_DYNAMIC; /
create OR REPLACE PROCEDURE log_change_info (vTABLE_NAME IN VARchar2, vKEY_VALUE IN VARchar2, dACTION_DATE IN DATE, vUSER_NAME IN VARchar2, vCOLUMN_NAME IN VARchar2, vOLD_VALUE IN VARchar2, vNEW_VALUE IN VARchar2) IS BEGIN IF (vNEW_VALUE IS NULL AND vOLD_VALUE IS NOT NULL) OR (vNEW_VALUE != vOLD_VALUE) OR (vNEW_VALUE IS NOT NULL AND vOLD_VALUE IS NULL) THEN insert INTO DATA_CHANGE_AUDIT (table_name, primary_key_value, column_name, action_date, old_value, new_value, user_name) VALUES (vTABLE_NAME, vKEY_VALUE, vCOLUMN_NAME, NVL(dACTION_DATE,SYSDATE), vOLD_VALUE, vNEW_VALUE, NVL(vUSER_NAME,USER)); END IF; END log_change_info; / |