Opening Hours :7AM to 9PM
CREATE [ OR REPLACE ] TRIGGER <trigger_name> [BEFORE | AFTER | INSTEAD OF ] [INSERT | UPDATE | DELETE......] ON <name of underlying object> [FOR EACH ROW] [WHEN <condition for trigger to get execute> ] DECLARE <Declaration part> BEGIN <Execution part> EXCEPTION <Exception handling part> END;
INSERT | UPDATE | DELETE | |
---|---|---|---|
:NEW | VALID | VALID | INVALID. There is no new value in delete case. | :OLD | INVALID. There is no old value in insert case | VALID | VALID |
Table_1 is emp table and Table_2 is department table.
CREATE TABLE emp( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager VARCHAR2(50), dept_no NUMBER); / CREATE TABLE dept( Dept_no NUMBER, Dept_name VARCHAR2(50), LOCATION VARCHAR2(50)); /Code Explanation Table ’emp’ creation.
BEGIN INSERT INTO DEPT VALUES(10,‘HR’,‘USA’); INSERT INTO DEPT VALUES(20,'SALES','UK’); INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN'); COMMIT; END; / BEGIN INSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30); INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ; INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10); COMMIT; END; /Code Explanation
CREATE VIEW msk_emp_view( Employee_name:dept_name,location) AS SELECT emp.emp_name,dept.dept_name,dept.location FROM emp,dept WHERE emp.dept_no=dept.dept_no; /Output
EMPLOYEE_NAME | DEPT_NAME | LOCATION |
---|---|---|
ZZZ | HR | USA | YYY | SALES | UK |
XXX | FINANCIAL | JAPAN |
BEGIN UPDATE msk_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’; COMMIT; END; /
CREATE TRIGGER msk_view_modify_trg INSTEAD OF UPDATE ON msk_emp_view FOR EACH ROW BEGIN UPDATE dept SET location=:new.location WHERE dept_name=:old.dept_name; END; /Code Explanation
BEGIN UPDATE msk_emp_view SET location='FRANCE' WHERE employee_name='XXX'; COMMIT; END; /SELECT * FROM msk_emp_view;
EMPLOYEE_NAME | DEPT_NAME | LOCATION |
---|---|---|
ZZZ | HR | USA | YYY | SALES | UK |
XXX | FINANCIAL | FRANCE |
CREATE [ OR REPLACE ] TRIGGER <trigger_name< FOR [INSERT | UPDATE | DELET.......] ON <name of underlying object< <Declarative part< BEFORE STATEMENT IS BEGIN <Execution part<; END BEFORE STATEMENT; BEFORE EACH ROW IS BEGIN <Execution part<; END EACH ROW; AFTER EACH ROW IS BEGIN <Execution part<; END AFTER EACH ROW; AFTER STATEMENT IS BEGIN <Execution part>; END AFTER STATEMENT; END;
CREATE TRIGGER emp_trig FOR INSERT ON emp COMPOUND TRIGGER BEFORE EACH ROW IS BEGIN :new.salary:=5000; END BEFORE EACH ROW; END emp_trig; /
BEGIN INSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30); COMMIT; END; /SELECT * FROM emp WHERE emp_no=1004;
EMP_NAME | EMP_NO | SALARY | MANAGER | DEPT_NO |
---|---|---|---|---|
CCC | 1004 | 5000 | AAA | 30 |
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 the SQL prompt, it produces the following result
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (7, 'Kriti', 22, 'HP', 7500.00 );When a record is created in the CUSTOMERS table, the above create trigger, display_salary_changes will be fired and it will display the following result
Old salary: New salary: 7500 Salary difference:
UPDATE customers SET salary = salary + 500 WHERE id = 2;When a record is updated in the CUSTOMERS table, the 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