Plsql - TriggersTriggers are stored programs, which are automatically executed or fired when some events occur. Triggers are, in fact, written to be executed in response to any of the following events:
Benefits of Triggers Triggers can be written for the following purposes:
The syntax for creating a trigger is:
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF } {INSERT [OR] | UPDATE [OR] | DELETE} [OF col_name] ON table_name [REFERENCING OLD AS o NEW AS n] [FOR EACH ROW] WHEN (condition) DECLARE Declaration statements BEGIN Executable statements EXCEPTION Exception-handlingstatements END; Where,
To start with, we will be using the CUSTOMERS table we had created and used in the previous chapters:
Select * from customers;
+ ---- + ---------- + ----- +----------- + ---------- + | ID | NAME | AGE | ADDRESS | SALARY | + ---- + ---------- + ----- +----------- + ---------- + | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | + ---- +---------- + ----- +----------- + ---------- + The following program creates a row level trigger for the customers table that would fire for INSERT or UPDATE or DELETE operations performed on the CUSTOMERS table. This trigger will display the salary difference between the old values and new values:
CREATE OR REPLACE TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON customers FOR EACH ROW WHEN (NEW.ID > 0) DECLARE sal_diff number; BEGIN sal_diff := :NEW.salary - :OLD.salary; dbms_output.put_line('Old salary: ' || :OLD.salary); dbms_output.put_line('New salary: ' || :NEW.salary); dbms_output.put_line('Salary difference: ' || sal_diff); END; / When the above code is executed at SQL prompt, it produces the following result:
Trigger created.
Here following two points are important and should be noted carefully:
Let us perform some DML operations on the CUSTOMERS table. Here is one INSERT statement, which will create a new record in the table:
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Kriti', 22, 'HP', 7500.00 ); When a record is created in CUSTOMERS table, above create trigger display_salary_changes will be fired and it will display the following result:
Old salary:
New salary: 7500 Salary difference: Because this is a new record so old salary is not available and above result is coming as null. Now, let us perform one more DML operation on the CUSTOMERS table. Here is one UPDATE statement, which will update an existing record in the table:
UPDATE customers
SET salary = salary + 500 WHERE id = 2; When a record is updated in CUSTOMERS table, above create trigger display_salary_changes will be fired and it will display the following result:
Old salary: 1500
New salary: 2000 Salary difference: 500 |