Essential PL/SQL Triggers, Procedures, and DDL Examples

Database Triggers for Data Integrity

Create table emp1 and dept1 same as emp and dept. Create a trigger which will delete all records from emp1 table of corresponding department deleted from dept1 table.

CREATE TABLE emp1 AS SELECT * FROM emp;
CREATE TABLE dept1 AS SELECT * FROM dept;

CREATE OR REPLACE TRIGGER trg_delete_emp1
AFTER DELETE ON dept1
FOR EACH ROW
BEGIN
    DELETE FROM emp1 WHERE deptno = :OLD.deptno;
END;
/

Create table totalsal as select deptno, sum(sal) sal from emp1 group by deptno. Write a trigger which will update total salary in totalsal table whenever there is modification in sal of emp1 table.

CREATE TABLE totalsal AS SELECT deptno, SUM(sal) sal FROM emp1 GROUP BY deptno;

CREATE OR REPLACE TRIGGER trg_update_totalsal
AFTER UPDATE OF sal ON emp1
FOR EACH ROW
BEGIN
    UPDATE totalsal
    SET sal = sal - :OLD.sal + :NEW.sal
    WHERE deptno = :OLD.deptno;
END;
/

PL/SQL Blocks and Cursors

Create a table emp1 same as emp. Write a PL/SQL block which will insert all the details of employees in a given department to a new table emp1 (use cursor).

CREATE TABLE emp1 AS SELECT * FROM emp WHERE 1=2;

DECLARE
    CURSOR c1 IS SELECT * FROM emp WHERE deptno = 10;
    v_emp emp%ROWTYPE;
BEGIN
    OPEN c1;
    LOOP
        FETCH c1 INTO v_emp;
        EXIT WHEN c1%NOTFOUND;
        INSERT INTO emp1 VALUES (v_emp.empno, v_emp.ename, v_emp.job, v_emp.mgr, v_emp.hiredate, v_emp.sal, v_emp.comm, v_emp.deptno);
    END LOOP;
    CLOSE c1;
END;
/

Stored Procedures for Salary Management

Create a table emp1 same as emp.

  • I. Write a procedure to update salary of a given employee to 3000 if salary is less than 3000, else give a 10% increment on emp1 table.
  • II. Write a PL/SQL procedure which will insert all the details of a given employee with empno to a new empty table emp1_new which has the same structure as emp.
CREATE TABLE emp1 AS SELECT * FROM emp;

CREATE OR REPLACE PROCEDURE update_salary(p_empno NUMBER) IS
    v_sal emp1.sal%TYPE;
BEGIN
    SELECT sal INTO v_sal FROM emp1 WHERE empno = p_empno;
    IF v_sal < 3000 THEN
        UPDATE emp1 SET sal = 3000 WHERE empno = p_empno;
    ELSE
        UPDATE emp1 SET sal = sal + (sal * 0.10) WHERE empno = p_empno;
    END IF;
END;
/

CREATE TABLE emp1_new AS SELECT * FROM emp WHERE 1=2;

CREATE OR REPLACE PROCEDURE insert_emp_details(p_empno NUMBER) IS
BEGIN
    INSERT INTO emp1_new SELECT * FROM emp WHERE empno = p_empno;
END;
/

PL/SQL Functions for Aggregation

Create a table emp1 same as emp.

  • I. Write a PL/SQL function which will return total salary paid to a given department number in emp1.
  • II. Write a PL/SQL function which will return the total number of employees working in a given department number in emp1.
CREATE OR REPLACE FUNCTION total_salary(p_deptno NUMBER) RETURN NUMBER IS
    v_total NUMBER;
BEGIN
    SELECT SUM(sal) INTO v_total FROM emp1 WHERE deptno = p_deptno;
    RETURN v_total;
END;
/

CREATE OR REPLACE FUNCTION total_employees(p_deptno NUMBER) RETURN NUMBER IS
    v_count NUMBER;
BEGIN
    SELECT COUNT(*) INTO v_count FROM emp1 WHERE deptno = p_deptno;
    RETURN v_count;
END;
/

Managing Database Views

Execute DDL/DML statements demonstrating the use of views:

  • Create table emp1 same as emp.
  • Create view dept20 for employees in department 20.
  • Update emp1 using view dept20.
  • Delete record using view dept20.
  • Create view dept30 with check option.
  • Insert record in view dept30 (demonstrate error).
  • Create and drop empview.
CREATE TABLE emp1 AS SELECT * FROM emp;
CREATE VIEW dept20 AS SELECT * FROM emp1 WHERE deptno = 20;
UPDATE dept20 SET comm = comm + 100 WHERE comm IS NOT NULL;
DELETE FROM dept20 WHERE empno = 7369;
CREATE VIEW dept30 AS SELECT * FROM emp1 WHERE deptno = 30 WITH CHECK OPTION;
-- INSERT INTO dept30 VALUES (73,'akash','clerk',7902,'17-DEC-1980',800,NULL,20);
CREATE VIEW empview AS SELECT e.empno, e.ename, e.sal, e.deptno, d.dname FROM emp1 e, dept d WHERE e.deptno = d.deptno;
DROP VIEW empview; DROP VIEW dept20; DROP VIEW dept30;

Advanced DDL and Constraints

Perform the following SQL queries on the database:

  • Add/Delete columns and constraints (Primary Key, Check, Default).
  • Modify data types.
ALTER TABLE emp1 ADD grade VARCHAR2(10);
ALTER TABLE emp DROP COLUMN grade;
ALTER TABLE emp1 ADD CONSTRAINT EMPNO_P PRIMARY KEY (empno);
ALTER TABLE emp DROP PRIMARY KEY;
ALTER TABLE emp1 ADD CONSTRAINT SAL_C CHECK (sal > 100);
ALTER TABLE emp1 MODIFY sal NUMBER(14,2);
ALTER TABLE student MODIFY ename DEFAULT 'UNKNOWN';
ALTER TABLE emp1 DROP COLUMN sal;