Oracle PL/SQL – After UPDATE Trigger example
This article shows you how to use AFTER UPDATE TRIGGER, it will fire after the update operation is executed.
1. Logging example
In this example, after each update on ‘SALARY’ column of employee_salary, it will fire a ‘after update’ trigger and insert the new updated data into a employee_salary_log table, for audit purpose.
1.1 Create tables and trigger.
CREATE TABLE employee_salary EMP_ID number(10), SALARY number(10), EMP_NAME varchar2(50) );
CREATE TABLE employee_salary_log EMP_ID number(10), NEW_SALARY number(10), UPDATED_DATE date, UPDATED_BY varchar2(20) );
CREATE OR REPLACE TRIGGER trg_log_employee_salary AFTER UPDATE OF SALARY ON employee_salary FOR EACH ROW DECLARE username varchar2(20); BEGIN -- get current login user SELECT USER INTO username FROM dual; -- Insert new values into log table. INSERT INTO employee_salary_log VALUES ( :NEW.EMP_ID, :NEW.SALARY, sysdate, username); END;
In before update trigger, do not update the employee_salary table, it will create a recursively trigger and run until it has run out of memory.
1.2 Insert data to test the trigger.
INSERT INTO employee_salary VALUES (101,15000,'Pranav'); INSERT INTO employee_salary VALUES (201,40000,'Vikram'); INSERT INTO employee_salary VALUES (301,35000,'Nikhil'); -- fire trigger, insert into log table UPDATE employee_salary SET SALARY = '28000' WHERE emp_id = 101; -- fire trigger, insert into log table UPDATE employee_salary SET SALARY = '43000' WHERE emp_id = 301;
1.3 Display the data.
select * from EMPLOYEE_SALARY;
EMP_ID | SALARY | EMP_NAME |
---|---|---|
101 | 28000 | Pranav |
201 | 40000 | Vikram |
301 | 43000 | Nikhil |
select * from EMPLOYEE_SALARY_LOG;
EMP_ID | NEW_SALARY | UPDATED_DATE | UPDATED_BY |
---|---|---|---|
101 | 28000 | 10-JUN-17 | SYSTEM |
301 | 43000 | 10-JUN-17 | SYSTEM |
2. Logging with WHEN condition
In this example, after each update on ‘SALARY’ column of employee_salary with hike greater than 50000, it will fire a ‘after update’ trigger and insert the new updated data into a employee_salary_log table.
2.1 Create tables and trigger.
CREATE TABLE employee_salary EMP_ID number(10), SALARY number(10), EMP_NAME varchar2(50) );
CREATE TABLE employee_salary_hike_log EMP_ID number(10), NEW_SALARY number(10), HIKE number(10), UPDATED_DATE date, UPDATED_BY varchar2(20) );
CREATE OR REPLACE TRIGGER trg_log_salary_hike AFTER UPDATE OF SALARY ON employee_salary FOR EACH ROW WHEN ((NEW.SALARY - OLD.SALARY) > 50000) DECLARE username varchar2(20); BEGIN SELECT USER INTO username FROM dual; -- Insert new values into log table. INSERT INTO employee_salary_hike_log VALUES ( :NEW.EMP_ID, :NEW.SALARY, :NEW.SALARY - :OLD.SALARY ,sysdate, username); END;
2.2 Insert data to test the trigger.
INSERT INTO employee_salary VALUES (101,15000,'Pranav'); INSERT INTO employee_salary VALUES (201,40000,'Vikram'); INSERT INTO employee_salary VALUES (301,35000,'Nikhil'); -- new salary - old salary > 50000, fire after update trigger, insert into log UPDATE employee_salary SET SALARY = '70000' WHERE emp_id = 101; UPDATE employee_salary SET SALARY = '100000' WHERE emp_id = 301; -- new salary - old salary < 50000, no action. UPDATE employee_salary SET SALARY = '45000' WHERE emp_id = 201;
2.3 Display the data.
select * from EMPLOYEE_SALARY;
EMP_ID | SALARY | EMP_NAME |
---|---|---|
101 | 70000 | Pranav |
201 | 45000 | Vikram |
301 | 100000 | Nikhil |
select * from EMPLOYEE_SALARY_HIKE_LOG;
EMP_ID | NEW_SALARY | HIKE | UPDATED_DATE | UPDATED_BY |
---|---|---|---|---|
101 | 70000 | 55000 | 10-JUN-17 | HR |
301 | 100000 | 65000 | 10-JUN-17 | HR |
References
From:一号门
Previous:Java 8 Streams map() examples
Next:Java 8 Tutorials
COMMENTS