You are on page 1of 50

PL/SQL (Embedded SQL)

Introduction
Benefits
Basic Constructs
Anonymous blocks
Procedures
Functions
Packages
Triggers
Cursors
Dynamic SQL
1ICS 334

Introduction

Embedded SQL (PL/SQL, JAVA/ VB & DB)


Database Server Level Programming
(PL/SQL, Transact-SQL, IBM DB2-Cobol, ProC,
ProCobol)

Database Client Programming


Developer 9i, JDeveloper 9i, Java (J2EE), VB, .Net

2ICS 334

- Benefits

More powerful than pure SQL because it


combines the power of SQL and

Iteration (loops)
Selection (Ifs)
Cursors
Block Structures
Stored Procedures
etc.

3ICS 334

- Basic Constructs

Basic Structure
Running a program
Variables
SELECT INTO
Comments
IFs
LOOPs
Output
4ICS 334

-- Basic Structure
DECLARE
BEGIN

EXCEPTION
END;

5ICS 334

- OUTPUT
SET SERVEROUTPUT ON;

BEGIN
DBMS_OUTPUT.PUT_LINE('This is my fist program');

END;
/

Before executing code that contains DBMS_OUTPUT.PUT_LINE,


must run (in a current session) at SQL prompt: set
serveroutput on
6ICS 334

--- Basic Structure: Example


DECLARE
v_id
INTEGER;
v_empno
NUMBER;
BEGIN
v_id := 1234567;
SELECT EMPNO
INTO V_EMPNO
FROM EMP
WHERE empno = v_id;
DBMS_OUTPUT.PUT_LINE('Value is '||v_empno);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No record exists');
/

END;

7ICS 334

--- Basic Structure: Example


DECLARE
v_idINTEGER;
BEGIN
v_id := 1234567;
DELETE
FROM EMP
WHERE id = v_id;
END;
/
8ICS 334

-- Running a Program
DECLARE
BEGIN

EXCEPTION
END;

9ICS 334

-- Variables

Common Data Types

NUMBER
DATE
INTEGER
VARCHAR2
CHAR
BOOLEAN

Declaration

V_salary
V_id
V_dob
V_name
V_gender
V_salary

NUMBER(9,2);
INTEGER;
DATE;
VARCHAR2(35);
CHAR;
emp.salary%TYPE;

10ICS 334

-- SELECT INTO
DECLARE
v_job
v_sal
v_empno

emp.job%TYPE;
emp.sal%TYPE;
emp.empno%TYPE;

BEGIN
v_empno := 1234567;
SELECT job, sal
INTO v_job,v_sal
FROM emp
WHERE empno = v_empno;
END;
/

11ICS 334

-- Another Example
declare
v_ename
emp.ename%TYPE;
v_sal
emp.sal%TYPE;
begin
select ename, sal
into v_ename, v_sal
from emp
where empno = '7844';
DBMS_OUTPUT.PUT_LINE('solution is:'||v_ename||'---'||v_sal);
exception
When others then
DBMS_OUTPUT.PUT_LINE('no record');
end;
/
Before executing code that contains DBMS_OUTPUT.PUT_LINE,
must run at SQL prompt: set serveroutput on

12ICS 334

-- Comments
DECLARE
/*
This block will do
so and so and so.
*/
v_job
emp.job%TYPE;
v_sal
emp.sal%TYPE;
v_empno
emp.empno%TYPE;
BEGIN
v_empno := 1234567; -- The use of this sentence is so and so.
-- The following SELECT INTO statement will do so and so.
SELECT job, sal
INTO v_job,v_sal
FROM emp
WHERE empno = v_empno;
END;
/

13ICS 334

-- IFs

IF END IF
IF ELSE END IF
IF ELSIF ELSE END IF

14ICS 334

--- IF END IF
DECLARE

BEGIN

v_commison := 7500;
IF v_dept = 10 THEN
v_commision := 5000;
END IF;

END;
/

15ICS 334

--- IF ELSE END IF


DECLARE

BEGIN

IF v_dept = 10 THEN
v_commision := 5000;
ELSE
v_commision := 7500;
END IF;

END;
/

16ICS 334

--- IF ELSIF ELSE END IF


DECLARE

BEGIN

IF v_dept = 10 THEN
v_commision := 5000;
ELSIF v_dept = 20 THEN
v_commison := 5500;
ELSIF v_dept = 30 THEN
v_commison := 6200;
ELSE
v_commision := 7500;
END IF;

END;
/

17ICS 334

-- LOOPs

LOOP EXIT WHEN END LOOP


FOR LOOP END LOOP
WHILE LOOP END LOOP

18ICS 334

--- LOOP EXIT WHEN END LOOP


DECLARE

v_deptno dept.deptno%TYPE := 50;


v_counter integer := 1;

BEGIN

LOOP
INSERT INTO dept(deptno)
VALUES(v_deptno);
v_counter := v_counter + 1;
v_deptno := v_deptno + 10;
EXIT WHEN v_counter > 5;
END LOOP;

END;
/

19ICS 334

--- FOR LOOP - END LOOP


DECLARE

v_deptno dept.deptno%TYPE := 50;


v_counter integer;

BEGIN

FOR v_counter IN 1..5 LOOP


INSERT INTO dept(deptno)
VALUES(v_deptno);
v_deptno := v_deptno + 10;
END LOOP;

END;
/

20ICS 334

--- WHILE LOOP - END LOOP


DECLARE

v_deptno dept.deptno%TYPE := 50;


v_counter integer;

BEGIN

v_counter := 1;
WHILE v_counter <= 5 LOOP
INSERT INTO dept(deptno)
VALUES(v_deptno);
v_deptno := v_deptno + 10;
END LOOP;

END;
/

21ICS 334

- OUTPUT
SET SERVEROUTPUT ON;
DECLARE
v_sum_sal
v_deptno

emp.sal%TYPE;
emp.deptno%TYPE := 10;

BEGIN
SELECT SUM(sal)
INTO v_sum_sal
FROM emp
WHERE deptno = v_deptno;
DBMS_OUTPUT.PUT_LINE('The sum is || TO_CHAR(v_sum_sal));
END;
/

22ICS 334

- Anonymous Block
DECLARE
v_id

INTEGER;

BEGIN
v_id := 1234567;
DELETE
FROM EMP
WHERE id = v_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No record exists');
/

END;

23ICS 334

-- Nesting Anonymous Blocks

24ICS 334

Exceptions
Examples are
NO_DATA_FOUND
OTHERS
To display details of oracle standard error
message
EXCEPTION

WHEN OTHERS THEN


DBMS_OUTPUT.PUT_LINE(Error detail is: ||
SQLERRM)
25ICS 334

- Procedure

Is a block with a name


The DECLARE key word is not used
Parameters can be

IN
OUT
IN OUT

Is stored (USER_SOURCE)

26ICS 334

-- Creating or Replacing a Procedure

CREATE OR REPLACE PROCEDURE pname(

) IS

BEGIN

EXCEPTION
END;
/
27ICS 334

-- Creating or Replacing a
Procedure
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE proc_test(p_empno IN VARCHAR2) IS
v_job
v_sal

EMP.job%TYPE;
EMP.sal%TYPE;

BEGIN
SELECT job, sal
INTO v_job,v_sal
FROM emp
WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE('job is '||v_job);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR...');
END;
/

SQL> Show errors


SQL> execute proc_test(5893);

28ICS 334

-- Invoking a Procedure
DECLARE

BEGIN

proc_test(23);

END;
/
Or
SQL> exec proc_test(1123)
29ICS 334

Another Example
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6
7
8
9
10
11
12*
SQL>

create or replace procedure test_proc is


v_id INTEGER;
v_empno emp.empno%TYPE;
BEGIN
v_id := 1234567;
select empno into v_empno
FROM EMP
WHERE empno = v_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No record exists');
END;
/

Procedure created.
SQL> exec test_proc
No record exists
PL/SQL procedure successfully completed.
SQL> show errors

(to see errors for procedures, functions)

30ICS 334

- Function

Is a block with a name


Returns one value only.
The DECLARE key word is not used
Parameters can only be IN
Is stored

31ICS 334

-- Creating or Replacing a Function


CREATE OR REPLACE FUNCTION fname(
RETURN datatype IS

BEGIN

EXECPTION
END;
/
32ICS 334

-- Creating or Replacing a Function


CREATE OR REPLACE FUNCTION sum_dept_sal(p_deptno IN NUMBER)
RETURN emp.sal%TYPE IS
v_sum_sal

emp.sal%TYPE;

BEGIN
SELECT SUM(sal)
INTO v_sum_sal
FROM emp
WHERE deptno = p_deptno;
RETURN v_sum_sal;
END;
/

33ICS 334

-- Invoking a Function
SET SERVEROUTPUT ON;
DECLARE

v_sal
emp.sal%TYPE;

BEGIN

v_sal := sum_dept_sal(10);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_sal));

END;
/
34ICS 334

Example, passing parameters

35ICS 334

Exercise

Write down a procedure that displays all


records (all columns) from EMP table. Make
sure program should restricted to fix
number of records of this table. Display
Date and TIME portions of column that has
data type DATE.
Write down a procedure that can insert
large number of records entered at the time
of its execution. You can use EMP table and
appending counter with some columns
values
36ICS 334

- Packages

Package

Package Specification
Package Body

Invoking Package subprogram

37ICS 334

-- Package Specification
CREATE OR REPLACE PACKAGE emp_info is
v_count

INTEGER;

PROCEDURE insert_record( p_empno IN NUMBER


, p_ename IN VARCHAR2
, p_job IN VARCHAR2
, p_sal IN NUMBER
, p_comm IN NUMBER
, p_deptno IN VARCHAR2);
PROCEDURE delete_record(p_empno IN NUMBER);
FUNCTION sum_dept_sal( p_deptno IN dept.deptno%TYPE) RETURN is dept.sal%TYPE;
END emp_info;
/

38ICS 334

-- Package Body
CREATE OR REPLACE PACKAGE BODY emp_info is`
PROCEDURE insert_record(p_empno IN NUMBER,p_ename IN VARCHAR2,
p_job IN VARCHAR2,p_sal IN NUMBER,
p_comm IN NUMBER,p_deptno IN VARCHAR2) IS
BEGIN
INSERT INTO EMP(empno,ename,job,sal,comm,deptno)
VALUES(p_empno,p_ename,p_job,p_sal,p_comm,p_deptno);
END insert_record;
PROCEDURE delete_record(p_empno IN NUMBER) IS
BEGIN
DELETE FROM EMP
WHERE empno=p_empno;
END delete_record;
FUNCTION sum_dept_sal(p_deptno IN NUMBER) RETURN emp.sal%TYPE IS
v_sum_sal emp.sal%TYPE;
BEGIN
SELECT SUM(sal)
INTO v_sum_sal
FROM emp
WHERE deptno = p_deptno;
RETURN v_sum_sal;
END;
END emp_info; --end of package body
/

39ICS 334

-- Invoking Package Subprogram


DECLARE
v_sum_sal emp.sal%TYPE;
BEGIN

v_sum_sal := emp_info.sum_dept_sal(10);

emp_info.delete_record(1234567);

END;
/

Or
SQL> exec

emp_info.insert_record(,)
40ICS 334

- Triggers

Is a stored subprogram associated with


a table.
Are fired by an event
Are mainly used for

Security
Enforce complex integrity constraint
Prevent invalid transaction
Event logging
41ICS 334

-- Creating or Replacing Triggers


CREATE OR REPLACE TRIGGER del_emp( p_empno emp.empno%TYPE)
BEFORE DELETE ON emp
FOR EACH ROW
BEGIN
INSERT INTO emp_audit
VALUES(p_empno, USER, sysdate);
END;
/

42ICS 334

-- Trigger with function usage


Example

43ICS 334

--Exercise
Write a trigger for the following:
When a record is added or deleted from
an employee table, DEPT.NoOfEmp
column gets updated accordingly to
number of employees in EMP table
corresponding to department number.

44ICS 334

- Cursors

Is a pointer to a row.
Its is mainly used with tables which
return more than one row.
It is handled implicitly and explicitly.

45ICS 334

- Cusrors
CURSOR c_emp IS
SELECT empno, ename, job
FROM emp
WHERE deptno = 20;
7369
7566
7788
7876
7906

Smith Clerk
Jones Manager
SCOTT Analyst
Adams Clerk
FORD Analyst

current row

46ICS 334

- Cursors
DECLARE
CURSOR c_emp IS
SELECT empno, ename, job
FROM emp
WHERE deptno = 20;
BEGIN
FOR v_c IN c_emp LOOP

DBMS_OUTPUT.PUT_LINE(v_c.ename);

END LOOP;

end;
/

47ICS 334

- Example

Given a table with


first three columns
are composite keys.
Write a PL/SQL
program using cursor
to update
cat_template1 with
LONG column
cat_template.
Assuming this tables
contains more than
40,000 records.
48ICS 334

- Examples solution

49ICS 334

Dynamic SQL
begin
execute immediate 'create table tt(id
number(3))';
end;
/

50ICS 334

You might also like