PL/SQL - Trigger

PL/SQL - Trigger


TRIGGERS:
->explicit calling -> called by the programmer
->implicit calling -> called by Oracle Engine -> auto calling
->Stored Procedures & Functions get explicity called. (by the programmer)
->Oracle Engine allows us to create / define procedures that get implicitly called (auto called) when a DML statement (INSERT, UPDATE, DELETE) is issued against a specific table from the SQL+ or an application.
->These spl. types of procedures are called TRIGGERS.
->Trigger is a spl. type of a Procedure that gets implicitly called when we run a DML statement on a specific table.

Triggers v/s Procedures:
->triggers do not accept arguments whereas procedures may/may not accept arguments.
->triggers get implicitly executed/called whereas procedures get explicitly executed / called.

Types of Triggers:

1. Row Trigger:
This type of a trigger gets fired each time a row in a table gets affected by the trigger statement.

2. Statement Trigger:
This type of a trigger is fired on behalf of the triggerring statement independent of the no. of rows affected. (even if no rows are affected, this will be fired).

Before Triggers:
executes the trigger action before the execution of the triggerring statement.

After Triggers:
executes the trigger action after the execution of the triggerring statement.

Before Row Trigger
After Row Trigger
Before Statement Trigger
After Statement Trigger

------------------------------------------------------------------------

Creating a Trigger:

CREATE OR REPLACE TRIGGER triggername
{BEFORE, AFTER}
{INSERT OR UPDATE OR DELETE}
ON tablename
FOR EACH ROW [WHEN condition]
DECLARE
variable declaration
BEGIN
pl/SQL code block
EXCEPTION
exception handling
END;

-----------------------------------------------------
Inside a trigger, we can access the old column values (while doing  update & delete operations) using
:OLD.columnname
and we can access the new column values (while doing insert operation) using
:NEW.columnname

to check what type of DML query fired the trigger use:
->inserting
->updating
->deleting
----------------------------------------------------
Create a trigger for recording the update & delete operations done on the emptab. the recording must occur inside the emplogtab;

CREATE OR REPLACE TRIGGER TRIG_EMP_TRANS_LOG
AFTER UPDATE OR DELETE
ON emptab
FOR EACH ROW
DECLARE
trans varchar2(10);
BEGIN
/*check the type of DML query*/
IF updating THEN
/*set the trans var*/
trans:='UPDATE';
ELSIF deleting THEN
/*set the trans var*/
trans:='DELETE';
END IF;
/*insert the old values into the emplogtab*/
INSERT INTO emplogtab
(empid,empname,dept,mgrid,transaction,dateoftrans)
VALUES(:OLD.empid, :OLD.empname, :OLD.dept, :OLD.mgrid, trans, SYSDATE);
END;
-------------------------------------------------------------------------
CREATE OR REPLACE TRIGGER TR_EMPLG_2
AFTER INSERT OR UPDATE OR DELETE
ON emptab2
FOR EACH ROW
DECLARE
trns varchar2(12);
BEGIN
IF inserting THEN
trns:='INSERT';
ELSIF updating THEN
trns:='UPDATE';
ELSIF deleting THEN
trns:='DELETE';
END IF;
IF trns='INSERT' THEN
INSERT INTO emplog
(empid,empname,dept,mgrid,trans,transdt)
VALUES(:NEW.empid, :NEW.empname, :NEW.dept, :NEW.mgrid, trns, SYSDATE);
ELSE
INSERT INTO emplog
(empid,empname,dept,mgrid,trans,transdt)
VALUES(:OLD.empid, :OLD.empname, :OLD.dept, :OLD.mgrid, trns, SYSDATE);
END IF;
END;
/

CREATE OR REPLACE TRIGGER TR_PHONETAB
AFTER INSERT OR UPDATE OR DELETE
ON phonetab1
FOR EACH ROW
DECLARE
ops varchar2(10);
BEGIN
IF inserting THEN
ops:='INSERT';
ELSIF updating THEN
ops:='UPDATE';
ELSIF deleting THEN
ops:='DELETE';
END IF;
IF ops='INSERT' THEN
INSERT INTO phonelogtab
(operation,id,brand,model,price)
VALUES(ops, :NEW.id, :NEW.brand, :NEW.model,:NEW.price);
ELSE
INSERT INTO phonelogtab
(operation,id,brand,model,price)
VALUES(ops, :OLD.id, :OLD.brand, :OLD.model,:OLD.price);
END IF;
END;
/
--------------------------------------------------------------------------
Practical:


SQL*Plus: Release 11.2.0.2.0 Production on Sun Mar 3 12:48:52 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Enter user-name: system
Enter password:

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

SQL> SELECT * FROM emptab;

     EMPID EMPNAME    DEPT            MGRID
---------- ---------- ---------- ----------
       101 julie      cse
       102 toffee     cse               101
       103 coco       cse               101
       104 ramni      HR
       105 brownie    HR                104
       106 candy      HR                104

6 rows selected.

SQL> CREATE TABLE emplogtab
  2  (
  3  ;

*
ERROR at line 3:
ORA-00904: : invalid identifier


SQL> DESC emptab;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 EMPID                                     NOT NULL NUMBER(4)
 EMPNAME                                            VARCHAR2(10)
 DEPT                                               VARCHAR2(10)
 MGRID                                              NUMBER(4)

SQL> CREATE TABLE emplogtab
  2  (
  3  empid number(4),
  4  empname varchar2(10),
  5  dept varchar2(10),
  6  mgrid number(4),
  7  transaction varchar(10)
  8  );

Table created.

SQL> ALTER TABLE emplogtab
  2  ADD dateoftrans date;

Table altered.

SQL> DESC emplogtab;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 EMPID                                              NUMBER(4)
 EMPNAME                                            VARCHAR2(10)
 DEPT                                               VARCHAR2(10)
 MGRID                                              NUMBER(4)
 TRANSACTION                                        VARCHAR2(10)
 DATEOFTRANS                                        DATE

SQL> CREATE OR REPLACE TRIGGER TRIG_EMP_TRANS_LOG
  2  AFTER UPDATE OR DELETE
  3  ON emptab
  4  FOR EACH ROW
  5  DECLARE
  6     trans varchar2(10);
  7  BEGIN
  8     /*check the type of DML query*/
  9     IF updating THEN
 10             /*set the trans var*/
 11             trans:='UPDATE';
 12     ELSIF deleting THEN
 13             /*set the trans var*/
 14             trans:='DELETE';
 15     END IF;
 16     /*insert the old values into the emplogtab*/
 17     INSERT INTO emplogtab
 18     (empid,empname,dept,mgrid,transaction,dateoftrans)
 19     VALUES(:OLD.empid, :OLD.empname, :OLD.dept, :OLD.mgrid, trans, SYSDATE);

 20  END;
 21  /

Trigger created.

SQL> SELECT * FROM emplogtab;

no rows selected

SQL> SELECT * FROM emptab;

     EMPID EMPNAME    DEPT            MGRID
---------- ---------- ---------- ----------
       101 julie      cse
       102 toffee     cse               101
       103 coco       cse               101
       104 ramni      HR
       105 brownie    HR                104
       106 candy      HR                104

6 rows selected.

SQL> UPDATE emptab SET empname='rammi' WHERE empid=104;

1 row updated.

SQL> SELECT * FROM emptab;

     EMPID EMPNAME    DEPT            MGRID
---------- ---------- ---------- ----------
       101 julie      cse
       102 toffee     cse               101
       103 coco       cse               101
       104 rammi      HR
       105 brownie    HR                104
       106 candy      HR                104

6 rows selected.

SQL> SELECT * FROM emplogtab;

     EMPID EMPNAME    DEPT            MGRID TRANSACTIO DATEOFTRA
---------- ---------- ---------- ---------- ---------- ---------
       104 ramni      HR                    UPDATE     03-MAR-13

SQL> DELETE FROM emptab WHERE empid=106;

1 row deleted.

SQL> SELECT * FROM emptab;

     EMPID EMPNAME    DEPT            MGRID
---------- ---------- ---------- ----------
       101 julie      cse
       102 toffee     cse               101
       103 coco       cse               101
       104 rammi      HR
       105 brownie    HR                104

SQL> SELECT * FROM emplogtab;

     EMPID EMPNAME    DEPT            MGRID TRANSACTIO DATEOFTRA
---------- ---------- ---------- ---------- ---------- ---------
       104 ramni      HR                    UPDATE     03-MAR-13
       106 candy      HR                104 DELETE     03-MAR-13

SQL>
------------------------------------------------------------------------------

Create a trigger for recording the insert, update & delete operations done on the emptab. the recording must occur inside the emplogtab;

CREATE OR REPLACE TRIGGER TRIG_EMP_TRANS_LOG
AFTER INSERT OR UPDATE OR DELETE
ON emptab
FOR EACH ROW
DECLARE
trans varchar2(10);
BEGIN
/*check the type of DML query*/
IF inserting THEN
/*set the trans var*/
trans:='INSERT';
ELSIF updating THEN
/*set the trans var*/
trans:='UPDATE';
ELSIF deleting THEN
/*set the trans var*/
trans:='DELETE';
END IF;

IF trans='INSERT' THEN
/*insert the newly inserted values into the emplogtab*/
INSERT INTO emplogtab
(empid,empname,dept,mgrid,transaction,dateoftrans)
VALUES(:NEW.empid, :NEW.empname, :NEW.dept, :NEW.mgrid, trans, SYSDATE);
ELSE
/*insert the old values into the emplogtab*/
INSERT INTO emplogtab
(empid,empname,dept,mgrid,transaction,dateoftrans)
VALUES(:OLD.empid, :OLD.empname, :OLD.dept, :OLD.mgrid, trans, SYSDATE);
END IF;
END;
----------------------------------------------------------------------------------------
Practicals:



SQL> CREATE OR REPLACE TRIGGER TRIG_EMP_TRANS_LOG
  2  AFTER INSERT OR UPDATE OR DELETE
  3  ON emptab
  4  FOR EACH ROW
  5  DECLARE
  6     trans varchar2(10);
  7  BEGIN
  8     /*check the type of DML query*/
  9     IF inserting THEN
 10             /*set the trans var*/
 11             trans:='INSERT';
 12     ELSIF updating THEN
 13             /*set the trans var*/
 14             trans:='UPDATE';
 15     ELSIF deleting THEN
 16             /*set the trans var*/
 17             trans:='DELETE';
 18     END IF;
 19
 20     IF trans='INSERT' THEN
 21             /*insert the newly inserted values into the emplogtab*/
 22             INSERT INTO emplogtab
 23             (empid,empname,dept,mgrid,transaction,dateoftrans)
 24             VALUES(:NEW.empid, :NEW.empname, :NEW.dept, :NEW.mgrid, trans, S
YSDATE);
 25     ELSE
 26             /*insert the old values into the emplogtab*/
 27             INSERT INTO emplogtab
 28             (empid,empname,dept,mgrid,transaction,dateoftrans)
 29             VALUES(:OLD.empid, :OLD.empname, :OLD.dept, :OLD.mgrid, trans, S
YSDATE);
 30     END IF;
 31  END;
 32  /

Trigger created.

SQL> SELECT * FROM emplogtab;

     EMPID EMPNAME    DEPT            MGRID TRANSACTIO DATEOFTRA
---------- ---------- ---------- ---------- ---------- ---------
       104 ramni      HR                    UPDATE     03-MAR-13
       106 candy      HR                104 DELETE     03-MAR-13

SQL> SELECT * FROM emptab;

     EMPID EMPNAME    DEPT            MGRID
---------- ---------- ---------- ----------
       101 julie      cse
       102 toffee     cse               101
       103 coco       cse               101
       104 rammi      HR
       105 brownie    HR                104

SQL> INSERT INTO emptab
  2  VALUES(106, 'candy', 'HR',104);

1 row created.

SQL> UPDATE emptab
  2  SET mgrid=105
  3  WHERE empid=106;

1 row updated.

SQL> SELECT * FROM emptab;

     EMPID EMPNAME    DEPT            MGRID
---------- ---------- ---------- ----------
       101 julie      cse
       102 toffee     cse               101
       103 coco       cse               101
       104 rammi      HR
       105 brownie    HR                104
       106 candy      HR                105

6 rows selected.

SQL> SELECT * FROM emplogtab;

     EMPID EMPNAME    DEPT            MGRID TRANSACTIO DATEOFTRA
---------- ---------- ---------- ---------- ---------- ---------
       104 ramni      HR                    UPDATE     03-MAR-13
       106 candy      HR                104 DELETE     03-MAR-13
       106 candy      HR                104 INSERT     03-MAR-13
       106 candy      HR                104 UPDATE     03-MAR-13

SQL>
----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------
CREATE A TRIGGER for insertion into the studenttab that first creates a valid roll no by combining 'PU' with rollseq.

CREATE OR REPLACE TRIGGER TRIG_GEN_ROLL_SEQ
BEFORE INSERT
ON studenttab
FOR EACH ROW
DECLARE
roll varchar2(5);
BEGIN
/*create the roll*/
roll:='PU'||TO_CHAR(rollseq.NEXTVAL);
/*update the roll*/
:NEW.ROLL_NO:=roll;
END;
----------------------------------------------------------------------------------------
Practical:
-------------------------------------------------------------------------------

SQL> create table studenttab (roll_no varchar2(5),name varchar2(10));

Table created.

SQL> DESC studenttab;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 ROLL_NO                                            VARCHAR2(5)
 NAME                                               VARCHAR2(10)

SQL> CREATE SEQUENCE rollseq
  2  INCREMENT BY 1 START WITH 100;

Sequence created.

SQL> CREATE OR REPLACE TRIGGER TRIG_GEN_ROLL_SEQ
  2  BEFORE INSERT
  3  ON studenttab
  4  FOR EACH ROW
  5  DECLARE
  6     roll varchar2(5);
  7  BEGIN
  8     /*create the roll*/
  9     roll:='PU'||TO_CHAR(rollseq.NEXTVAL);
 10     /*update the roll*/
 11     :NEW.ROLL_NO:=roll;
 12  END;
 13  /

Trigger created.

SQL> INSERT INTO studenttab
  2  (name)
  3  VALUES('Amit');

1 row created.

SQL> SELECT * FROM studenttab;

ROLL_ NAME
----- ----------
PU100 Amit

SQL> INSERT INTO studenttab
  2  (name)
  3  VALUES('Sumit');

1 row created.

SQL> INSERT INTO studenttab
  2  (name)
  3  VALUES('Kamit');

1 row created.

SQL> SELECT * FROM studenttab;

ROLL_ NAME
----- ----------
PU100 Amit
PU101 Sumit
PU102 Kamit

SQL>
-----------------------------------------------------------------------------------------------------------------------------------

Post a Comment

0 Comments