7/29/2019 PLSQL Complete Reference
1/92
1
PLSQL: Procedural Structured Query Language.
t is one of the comprehensive tools of the oracle that is helpful in adding the procedural
anguage features such as
Decision making, looping, exception handling etc... to the powerful SQL.
PLSQL Programs contains 3 sections.
1)Declaration section:In this section we declare the variables ,cursors etc
2)Executable section: In this section we do the looping, decision making and to the sq.
tatements
3)Exception section: In this section we handle the exceptions raised while using the sq.
tatements.
Every plsql statement should be terminated with semi colon(;)
Variable: A variable is a named location in memory to which a data can be assigned or from
which the data can be read.
Variable declaration: A variable is declared in the declaration section for the process of
elling the compiler,the name memory location its type and size.
Variable Declaration Syntax:
Variable_name datatype(size);
Ex: ln_num number;
Ln_flag char(1);
Ln_msg varchar2(10000);
Assigment Operator (:=)
This operator is used to assign the value on its right to the variable on its left.
EX: ln_num:= 0;
Ln_falg:= N;
7/29/2019 PLSQL Complete Reference
2/92
2
Intialization:
This is process of assigning a variable an intial value at the time of declaration of the
variable.
Ex: ln_num NUMBER:= 0;
Ln_falg char(1):= N;
Server output:
t is an sql environment variable that tells whether the output of the plsql program has to be
hown, by default it is OFF;
nordet to ON please run the below command at the beginning of every session.
SET SERVEROUTPUT ON;
DBMS_OUTPUT.PUT_LINE:
This is one of the built in package.function of the plsql that is used to print the output.
BLOCKS:
BLOCKS Reusability Stogare Scope
Anonymous Not there NO Until the session
Named Yes Yes Permanently
Lets write some anonymous blocks to get practiced of how to print a message and use the
variables and assign a value to it and also assign an intial value to it.
7/29/2019 PLSQL Complete Reference
3/92
3
To Print a Message.
begin
dbms_output.put_line('Welcome to Plsql');
end;
/
declare
ln_msg varchar2(1000);
begin
dbms_output.put_line('Start');
ln_msg:= 'Welcome to Plsql';
dbms_output.put_line(ln_msg);
dbms_output.put_line('End');
end;
/
declare
ln_num number:=¶meter1;
begin
dbms_output.put_line('Start');
dbms_output.put_line(ln_num);
dbms_output.put_line('End');
end;
/
7/29/2019 PLSQL Complete Reference
4/92
4
1)Addtion of 2 numbers.declare
ln_num number:=0;
ln_num1 number:=¶meter1;
ln_num2 number:=¶meter2;
begin
dbms_output.put_line('Start');
ln_num := ln_num1 + ln_num2;
dbms_output.put_line('The sum of '||ln_num1||' and '||ln_num2||' is
'||chr(10)||ln_num);
dbms_output.put_line('End');
end;
2) Substraction 2 numbers.3)Addition of 2 numbers and substracting the 3 number.4)Multiplication of 2 numbers.
Decision Making:f condition Syntax:
IF condition1 then
Statement1;
ELSIF condition2 then
Statement2;
ELSIF condition3 then
Statement3;
ELSE
Statement n;
END IF;
7/29/2019 PLSQL Complete Reference
5/92
5
5) Display Max of 2 numbersdeclare
ln_num1 number:=¶meter1;
ln_num2 number:=¶meter2;
begin
dbms_output.put_line('Start');
IF ln_num1 > ln_num2 then
dbms_output.put_line('The smax number is '||ln_num1);
else
dbms_output.put_line('The smax number is '||ln_num2);
end if;
dbms_output.put_line('End');
end;
/
7)Give input as 3 numbers and print the max number
8) Give input as 3 numbers and print the max number when added 2 numbers.
7/29/2019 PLSQL Complete Reference
6/92
6
LOOPING:
Syntax: FOR variable in start..end
LOOP
--any action to be taken place
END LOOP;
EX: 1) Print the numbers from 1 to 100/.
declare
i number:= 0;
begin
for i in 1..100
loop
dbms_output.put_line('The number is ' ||i);
end loop;
end;
2) Print the odd numbers from 1 to 20.
declare
i number:= 0;
begin
for i in 1..20
loop
if mod(i,2)!= 0 then
dbms_output.put_line('The odd number is ' ||i);
end if;
end loop;end;
/
7/29/2019 PLSQL Complete Reference
7/92
7
3) print the even numbers from 1 to 20.
declare
i number:= 0;
begin
for i in 1..20
loop
if mod(i,2) = 0 then
dbms_output.put_line('The odd number is ' ||i);
end if;
end loop;
end;
/
7/29/2019 PLSQL Complete Reference
8/92
8
EXIT:
This is an oracle provided plsql keyword using which we can come out of the loop.
EX: Print the odd numbers from 1 to 50 and exit when ever you find the number 26 in the
oop..
declare
number:= 0;
begin
for i in 1..50
loop
if i = 26 then
exit;
else
if mod(i,2) != 0 then
dbms_output.put_line('The odd number is ' ||i);
end if;
end if;
end loop;
dbms_output.put_line('The end ');
end;
NOTE:
Whenever we write a sql statement in a plsql block we cannot use the column name directly
for any manipulation purpose etc.
We should fetch the values in to the local variables using INTO Clause.
Total No of column in the select clause should be equal to total number of variables in the
nto clause.
The order of selected columns data type and size sequence should be same as the order of
variables sequence data type and size in the into clause.
7/29/2019 PLSQL Complete Reference
9/92
9
EX: Write a Simple plsql block to display employee name,number,salary.
declare
n_empno number:=0;
n_ename varchar2(100);
n_sal number;
begin
select empno,ename,sal
into ln_empno,ln_ename,ln_sal
from emp
where empno = ¶meter1;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);
dbms_output.put_line('The empno is --'||ln_empno);
end;
7/29/2019 PLSQL Complete Reference
10/92
10
%TYPE: This attribute is used to declare the plsql variables with the same definition as
column definition of a table.
Syntax: variable Name Table_Name.Column_Name%type;
EX: Write a Simple plsql block to display employee name,number,salary.
declare
n_empno emp.empno%type;
n_ename emp.ename%type;
n_sal emp.sal%type;
begin
select empno,ename,sal
into ln_empno,ln_ename,ln_sal
from emp
where empno = ¶meter1;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);dbms_output.put_line('The empno is --'||ln_empno);
end;
7/29/2019 PLSQL Complete Reference
11/92
11
Write a Simple plsql block to display employee name,number,salary, department name and
ocation.
declare
n_empno emp.empno%type;
n_ename emp.ename%type;
n_sal emp.sal%type;
n_dname dept.dname%type;
n_loc dept.loc%type;
begin
select empno,ename,sal,dname,loc
into ln_empno,ln_ename,ln_sal,ln_dname,ln_loc
from emp e,dept d
where empno = ¶meter1
and e.deptno = d.deptno;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);
dbms_output.put_line('The empno is --'||ln_empno);dbms_output.put_line('The dpartment name is --'||ln_dname);
dbms_output.put_line('The location is --'||ln_loc);
end;
7/29/2019 PLSQL Complete Reference
12/92
12
Write a simple plsql block to display maximum salary from the emp table.
declare
ln_sal emp.sal%type;
begin
select max(sal)
into ln_sal
from emp;
dbms_output.put_line('The max sal is --'||ln_sal);
end;
/
7/29/2019 PLSQL Complete Reference
13/92
13
Procedure:
Create or replace procedure p_name(parameter1 datatype, parameter2 datatype)
Is
BEGIN
NULL;
END
Ex: create or replace procedure xx_max_sal
s
ln_sal emp.sal%type;
begin
select max(sal),deptno
into ln_sal
from emp;
dbms_output.put_line('The max sal is --'||ln_sal);
end;
/
Execution :begin
xx_max_sal;
end;
/
Exec xx_max_sal;
7/29/2019 PLSQL Complete Reference
14/92
14
EX: Write a Simple proceudre to display employee name,number,salary, department name
and location.
create or replace procedure xx_emp_dtls(p_empno number)
s
n_empno emp.empno%type;
n_ename emp.ename%type;
n_sal emp.sal%type;
n_dname dept.dname%type;
n_loc dept.loc%type;
begin
select empno,ename,sal,dname,loc
into ln_empno,ln_ename,ln_sal,ln_dname,ln_loc
from emp e,dept d
where empno = p_empno
and e.deptno = d.deptno;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);dbms_output.put_line('The empno is --'||ln_empno);
dbms_output.put_line('The dpartment name is --'||ln_dname);
dbms_output.put_line('The location is --'||ln_loc);
end;
7/29/2019 PLSQL Complete Reference
15/92
15
Exercise:
Write a procedure to print the student information and their total marks and grade.
how student marks,result,grade even if the student information doesnot exists
by passing input parameter as sno and grade.
Write a procedure to print the student information and their total marks and grade.
how student marks,result,grade even if the student information doesnot exists
by passing input parameter as sno and result.
Write a procedure to print the student information and their total marks and grade.
how student marks,result,grade even if the student information doesnot exists
by passing input parameter as sno and marks. The student marks should be greater then
marks parameter value.
7/29/2019 PLSQL Complete Reference
16/92
16
EXCEPTIONS.
Exception is an abnormal condition that causes the termination of the program in the
middle of the execution.
Exception Handler:
It is a unit of plsql code that oracle engine raised when an exception is occurred.
When an exception is occurred,oracle engine identifies it and raises the exception to the
exception handler which scans the plsql program for the occurrence of exception section and
f found the exception handler then checks for the occurrence of the word when followed by
a predefined or user defined exception,which inturn followed by a then keyword and action
associated with that exception.
Exceptions are of 2 types:
1) Predefined exception.
2) User defined exception. these can be rasied explicitly by the user.
Some predefined exceptions examples:
1)Zero divide by
Occurs when the divisor is zero.
2) No_data_found Occurs when the sql select statement fetching the records intovariables retrieves no rows.
3) Too_many_rowsOccurs when the sql select statement fetching the records intovariables retrieves more then one row.
4) Others Any other type exceptions rasied will be handled using thisexception.
7/29/2019 PLSQL Complete Reference
17/92
17
NOTE: Exception should be always placed between begin and end block and exactly before
he end.
Syntax: BEGIN
--Any sql Statement.
EXCEPTION
WHEN Exception Name THEN
Any action to be taken place (like printing a error message)
END;
n the above syntax there can be many when exception clauses and if we use others
exception clause then it should be placed at last always.
f iam using no_data_found,too_many_rows and others exception then the seq should be
always as per below example
BEGIN
--Any sql Statement.
EXCEPTION
WHEN NO_DATA_FOUND THENAny action to be taken place (like printing a error message);
WHEN TOO_MANY_ROWS THEN
Any action to be taken place (like printing a error message);
WHEN OTHERS THEN
Any action to be taken place (like printing a error message);
END;
7/29/2019 PLSQL Complete Reference
18/92
18
But if I write in below way that will error.
BEGIN
--Any sql Statement.
EXCEPTION
WHEN NO_DATA_FOUND THEN
Any action to be taken place (like printing a error message);
WHEN OTHERS THEN
Any action to be taken place (like printing a error message);
WHEN TOO_MANY_ROWS THEN
Any action to be taken place (like printing a error message);
END;
BEGIN
--Any sql Statement.
EXCEPTION
WHEN OTHERS THEN
Any action to be taken place (like printing a error message);WHEN NO_DATA_FOUND THEN
Any action to be taken place (like printing a error message);
WHEN TOO_MANY_ROWS THEN
Any action to be taken place (like printing a error message);
END;
7/29/2019 PLSQL Complete Reference
19/92
19
SQLERRM:Sql Error Message
It is an oracle predefined keyword which holds oracle error message when any exception
aises.
Ex:1
create or replace procedure xx_emp_dtls(p_empno number)
s
n_empno emp.empno%type;
n_ename emp.ename%type;
n_sal emp.sal%type;
n_dname dept.dname%type;
n_loc dept.loc%type;
n_flag char(1):= 'N';
begin
BEGIN
select empno,ename,sal,dname,loc
into ln_empno,ln_ename,ln_sal,ln_dname,ln_loc
from emp e,dept d
where empno = p_empnoand e.deptno = d.deptno;
exception
when no_data_found then
dbms_output.put_line('No data exists for the passed empno'||p_empno);
when too_many_rows then
dbms_output.put_line('too many rows for the passed');
when others then
dbms_output.put_line('Others exception raised'||substr(sqlerrm,1,250));
END;
dbms_output.put_line('The ename is --'||ln_ename);
7/29/2019 PLSQL Complete Reference
20/92
20
dbms_output.put_line('The sal is --'||ln_sal);
dbms_output.put_line('The empno is --'||ln_empno);
dbms_output.put_line('The dpartment name is --'||ln_dname);
dbms_output.put_line('The location is --'||ln_loc);
exception
when others then
dbms_output.put_line('Error in the xx_emp_dtls proceudre'||substr(sqlerrm,1,250));
end;
Ex2: create or replace procedure xx_emp_dtls(p_deptno number)
s
n_empno emp.empno%type;
n_ename emp.ename%type;
n_sal emp.sal%type;
n_dname dept.dname%type;
n_loc dept.loc%type;
n_flag char(1):= 'N';
begin
BEGINselect empno,ename,sal,dname,loc
into ln_empno,ln_ename,ln_sal,ln_dname,ln_loc
from emp e,dept d
where e.deptno = p_deptno
and e.deptno = d.deptno;
exception
when no_data_found then
dbms_output.put_line('No data exists for the passed empno'||p_deptno);
when too_many_rows then
dbms_output.put_line('too many rows for the passed');
7/29/2019 PLSQL Complete Reference
21/92
21
when others then
dbms_output.put_line('Others exception raised'||substr(sqlerrm,1,250));
END;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);
dbms_output.put_line('The empno is --'||ln_empno);
dbms_output.put_line('The dpartment name is --'||ln_dname);
dbms_output.put_line('The location is --'||ln_loc);
exception
when others then
dbms_output.put_line('Error in the xx_emp_dtls proceudre'||substr(sqlerrm,1,250));
end;
create or replace procedure xx_emp_dtls(p_deptno number)
s
n_empno emp.empno%type;
n_ename emp.ename%type;
n_sal emp.sal%type;
n_dname dept.dname%type;n_loc dept.loc%type;
n_flag char(1):= 'N';
begin
BEGIN
select empno,ename,sal,dname,loc
into ln_empno,ln_ename,ln_sal,ln_dname,ln_loc
from emp e,dept d
where e.deptno = p_deptno
and e.deptno = d.deptno;
exception
7/29/2019 PLSQL Complete Reference
22/92
22
when no_data_found then
null;
when others then
dbms_output.put_line('Others exception raised'||substr(sqlerrm,1,250));
END;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);
dbms_output.put_line('The empno is --'||ln_empno);
dbms_output.put_line('The dpartment name is --'||ln_dname);
dbms_output.put_line('The location is --'||ln_loc);
exception
when others then
dbms_output.put_line('Error in the xx_emp_dtls proceudre'||substr(sqlerrm,1,250));
end;
Print the no of records exists for the passed deptno and also print the employee dtls for the
passed empno
create or replace procedure xx_dtls(p_deptno dept.deptno%type
,p_empno emp.empno%type)s
n_cnt number;
n_empno emp.empno%type;
n_ename emp.ename%type;
n_sal emp.sal%type;
n_dname dept.dname%type;
n_loc dept.loc%type
7/29/2019 PLSQL Complete Reference
23/92
23
BEGIN
elect count(*)
into ln_cnt
from emp
where deptno = p_deptno;
dbms_output.put_line('The no of records is '||ln_cnt);
- printing the emp details
BEGIN
select empno,ename,sal,dname,loc
into ln_empno,ln_ename,ln_sal,ln_dname,ln_loc
from emp e,dept d
where e.empno = p_empno
and e.deptno = d.deptno;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);
dbms_output.put_line('The empno is --'||ln_empno);
dbms_output.put_line('The dpartment name is --'||ln_dname);
dbms_output.put_line('The location is --'||ln_loc);
exceptionwhen no_data_found then
null;
when others then
dbms_output.put_line('Others exception raised'||substr(sqlerrm,1,250));
END;
exception
when others then
dbms_output.put_line('Error in the xx_dtls procedure '||substr(sqlerrm,1,250));
END;
7/29/2019 PLSQL Complete Reference
24/92
24
Exercise: modify the written procedure by handling the exceptions in a right approach
Write a procedure to print the student information and their total marks and grade.
how student marks,result,grade even if the student information doesnot exists
by passing input parameter as sno and grade.
Write a procedure to print the student information and their total marks and grade.
how student marks,result,grade even if the student information doesnot exists
by passing input parameter as sno and result.
Write a procedure to print the student information and their total marks and grade.
how student marks,result,grade even if the student information doesnot exists
by passing input parameter as sno and marks. The student marks should be greater then
marks parameter value.
User defined Exception: This is a exception which is declared in the declaration section by
he user and rasie ir explicitly rasie keyword when ever we require..
Syntax: variable_name EXCEPTION.
7/29/2019 PLSQL Complete Reference
25/92
25
Ex: create or replace procedure xx_dtls(p_deptno dept.deptno%type
,p_empno emp.empno%type)
is
ln_cnt number;
ln_empno emp.empno%type;
ln_ename emp.ename%type;
ln_sal emp.sal%type;
ln_dname dept.dname%type;
ln_loc dept.loc%type;
u_exp EXCEPTION;
BEGIN
select count(*)
into ln_cnt
from emp
where deptno = p_deptno;
dbms_output.put_line('The no of records is '||ln_cnt);
if ln_cnt = 0 then
raise u_exp;end if;
-- printing the emp details
BEGIN
select empno,ename,sal,dname,loc
into ln_empno,ln_ename,ln_sal,ln_dname,ln_loc
from emp e,dept d
where e.empno = p_empno
and e.deptno = d.deptno;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);
7/29/2019 PLSQL Complete Reference
26/92
26
dbms_output.put_line('The empno is --'||ln_empno);
dbms_output.put_line('The dpartment name is --'||ln_dname);
dbms_output.put_line('The location is --'||ln_loc);
exception
when no_data_found then
null;
when others then
dbms_output.put_line('Others exception raised'||substr(sqlerrm,1,250));
END;
exception
when u_exp then
dbms_output.put_line('user defined exception rasied');
when others then
dbms_output.put_line('Error in the xx_dtls procedure '||substr(sqlerrm,1,250));
END;
/
7/29/2019 PLSQL Complete Reference
27/92
27
Write a procedure to print the no of records for the passed deptno and print emp dtails for the
passes emp no. befire printing check if the flag value is Y. if it is other then Y or num or too
many rows in the table then rasie user defined exception and print a appropriate message.
Create table ckh_tble(flag char(1));
create or replace procedure xx_dtls(p_deptno dept.deptno%type
,p_empno emp.empno%type)
is
ln_cnt number;
ln_empno emp.empno%type;
ln_ename emp.ename%type;
ln_sal emp.sal%type;
ln_dname dept.dname%type;
ln_loc dept.loc%type;
u_exp EXCEPTION;
n_flag char(1);
BEGINbegin
select nvl(flag,N)
into ln_flag
from chk_tble;
exception
when no_data_found then
ln_flag := 'N' ;
when others then
ln_flag := 'N' ;
end;
7/29/2019 PLSQL Complete Reference
28/92
28
f ln_flag = 'N' then
raise u_exp;
end if;
select count(*)
into ln_cnt
from emp
where deptno = p_deptno;
dbms_output.put_line('The no of records is '||ln_cnt);
-- printing the emp details
BEGIN
select empno,ename,sal,dname,loc
into ln_empno,ln_ename,ln_sal,ln_dname,ln_loc
from emp e,dept d
where e.empno = p_empno
and e.deptno = d.deptno;
dbms_output.put_line('The ename is --'||ln_ename);
dbms_output.put_line('The sal is --'||ln_sal);
dbms_output.put_line('The empno is --'||ln_empno);
dbms_output.put_line('The dpartment name is --'||ln_dname);dbms_output.put_line('The location is --'||ln_loc);
exception
when no_data_found then
null;
when others then
dbms_output.put_line('Others exception raised'||substr(sqlerrm,1,250));
END;
exception
when u_exp then
dbms_output.put_line('user defined exception rasied please check the chk_tble');
7/29/2019 PLSQL Complete Reference
29/92
29
when others then
dbms_output.put_line('Error in the xx_dtls procedure '||substr(sqlerrm,1,250));
END;
nsert into table as valueYsuccess for printing
nsert into table as valueY,N etc multiple combinationsraise exception
nsert into table as valueNraise exception
nsert into table as valueNull value.raise exception
7/29/2019 PLSQL Complete Reference
30/92
30
Cursors.
Cursors:
A cursor is a memory area in to which the rows of a select statement are loaded and
processed.
Records Pointer: When a cursor is created oracle creates a pointer called record pointer that
points to the current record among the set of the records in the cursor
Cursor attributes
A part from the creating a record pointer after the cursor is created oracle also creates some
variables
called cursor attributes which are used in knowing the status of the cursor like to know
whether the cursor is open,close,found,not found
1)%Open = Return the status of the cursor
2)%Found = Determines whether any records exists of that select stmt assigned to the
cursor
3)%NOT Found = Determines whether any records not exists of that select stmt assigned to
he cursor
4)%ROWCOUNT = gives the no of rows in the cursor...
---------------------------------------------------------------------
7/29/2019 PLSQL Complete Reference
31/92
31
There are 2 types of cursors
1) Implicit cursor:
If the cursor is created by oracle then it is said to be Implicit Cursor
The Name of the Implicit cursor is always be SQL
Plsql Block to demostrate Implicit cursor....
Ex1:
Create or replace procedure p_upd_emp(p_deptno number)
s
begin
UPDATE EMP
SET sal = sal+100
where deptno = p_deptno;
IF SQL%FOUND THEN
dbms_output.put_line('Cursor found');END IF;
IF SQL%NOTFOUND THEN
dbms_output.put_line('Cursor not found ');
END IF;
exception
when others then
dbms_output.put_line('Error in the p_upd_emp procedure'||sqlerrm);
End;
----------------------------------
7/29/2019 PLSQL Complete Reference
32/92
32
plsql block to demostrate to kow how many records got deleted
or updated...
Create or replace procedure p_upd_emp(p_deptno number)
s
begin
UPDATE EMP
SET sal = sal+100
where deptno = p_deptno;
IF SQL%FOUND THEN
dbms_output.put_line('Cursor found');
END IF;
IF SQL%NOTFOUND THEN
dbms_output.put_line('Cursor not found ');
END IF;
dbms_output.put_line('no of records updated are '||sql%rowcount);
exceptionwhen others then
dbms_output.put_line('Error in the p_upd_emp procedure'||sqlerrm);
End;
-
Create or replace procedure p_upd_emp(p_deptno number)
s
n_cnt number;
begin
UPDATE EMP
7/29/2019 PLSQL Complete Reference
33/92
33
SET sal = sal+100
where deptno = p_deptno;
IF SQL%FOUND THEN
dbms_output.put_line('Cursor found');
END IF;
IF SQL%NOTFOUND THEN
dbms_output.put_line('Cursor not found ');
END IF;
n_cnt:= sql%rowcount;
dbms_output.put_line('no of records updated are '||ln_cnt);
exception
when others then
dbms_output.put_line('Error in the p_upd_emp procedure'||sqlerrm);
End;
-------------------------------------------------------------------------------
2) Explicit cursor:If it is created by the programmer with the help of cursor keyword in the declaration
ections , it is called
explicit cursor...
The Name of the explicit cursor is user defined.....
Steps for creating the Explicit Cursor....
1) Declare the cursor in the declaration section via using the CURSOR Keyword...
7/29/2019 PLSQL Complete Reference
34/92
34
Syntax: CURSOR CURSORNAME
IS Select Statement;
Ex: Cursor c_emp
is select * from emp;
When the above statement is executed then the pl/sql engine just makes a note of the cursor
name(c_emp) with its associated select statement but doesnot associate memory for the o/p
f the
elect statement.
Memory allocation is done only when the cursor is opened.
OIpen the cursor in the executable part...this is associated via the OPEN Keyword.
Syntax: Open cursor_name;
Ex: Open C_emp;
When the above select statement is executed then the pl/sql engine executes the select
tatement
associated with the cursor c_emp and then allocates memory for the output of the select
tatement.
Start the loop
Syntax :LOOP
7/29/2019 PLSQL Complete Reference
35/92
35
Fetch the values of the current record from the cursor in to the variables which are already
declared.
SYNTAX: Fetch Cursor name into var1,var2....
Ex: Fetch c_emp into v_empno,v_ename
The Number of variables in the fetch stmt into clause must be same with the no of columns
present in the cursor.... in terms of both datatype and size.
EXIT when the cursor finds no records left to be processed in the loop
End the loop and CLOSE the Cursor
Ex: END LOOP;
EX: Close c_emp;
After close of the cursor the records in the cursor memory is released.
----------------------------------------------
EX: Print the empname,sal,comm,job,dname,locations for those whose
salary is greater then the min sal of the deptno 20;
Create or replace procedure xx_emp_dtls(p_deptno number)
s
cursor c_emp is
elect e.ename
,e.sal
-- ,nvl(e.comm,0) comm
-- ,e.job
-- ,d.dname
7/29/2019 PLSQL Complete Reference
36/92
36
,d.loc
from emp e
,dept d
where d.deptno(+) = e.deptno
and sal >(select min(sal) from emp where deptno = p_deptno);
v_ename emp.ename%type;
v_sal number;
v_loc dept.loc%type;
begin
open c_emp;
LOOP
FETCH c_emp into v_ename,v_sal,v_loc;
EXIT WHEN c_emp%notfound;
dbms_output.put_line('ename'||v_ename);
dbms_output.put_line('salary'||v_sal);
dbms_output.put_line('location'||v_loc);
END LOOP;
-
close c_emp;END xx_emp_dtls;
EX: Print the empname,sal, locations by passing the deptno as parameter.
If no records found for the given deptno value then print invalid deptno and if
deptno is valid then print the emp details and if the deptno is passed as null then print
he data for all the deptno satisfying the query.
7/29/2019 PLSQL Complete Reference
37/92
37
Create or replace procedure xx_emp_dtls(p_deptno number)
s
cursor c_emp is
elect e.ename
,e.sal
,d.loc
from emp e
,dept d
where d.deptno(+) = e.deptno
and e.deptno = nvl(p_deptno,e.deptno);
v_ename emp.ename%type;
v_sal number;
v_loc dept.loc%type;
n_flag char(1):= 'N';
begin
-
open c_emp;
LOOP
FETCH c_emp into v_ename,v_sal,v_loc;EXIT WHEN c_emp%notfound;
ln_flag:= 'Y';
dbms_output.put_line('emp detials are '||v_ename||'----'||v_sal||'----'||v_loc);
END LOOP;
-
f ln_flag = 'N' then
dbms_output.put_line('Invalid deptno passed '||p_deptno);
end if;
close c_emp;
END xx_emp_dtls;
7/29/2019 PLSQL Complete Reference
38/92
38
2) write a plsql procedure to increase the salary of the employee of the emp
able by 10% if job is manager
6% if job is clerk
5% is job is salesman
2% is any other.
Pass deptno and empno as parameters and do the updation for all the records if the
deptno and empno is passed as null and for the passed combination of deptno,empno
values if there are no records in the query then print the message no data exists for the
passed input values
Create or replace procedure xx_upate_sal(p_deptno number,p_empno number)
s
cursor c_emp is
elect ename,job,empno,sal
from emp
where deptno = nvl(p_deptno,deptno)
and empno = nvl(p_empno,empno);
v_ename emp.ename%type;v_job emp.job%type;
v_empno emp.empno%type;
v_sal emp.sal%type;
n_flag char(1):= 'N';
begin
open c_emp;
LOOP
FETCH c_emp into v_ename,v_job,v_empno,v_sal;
EXIT WHEN c_emp%notfound;
ln_flag:= 'Y';
7/29/2019 PLSQL Complete Reference
39/92
39
dbms_output.put_line('old sal '||v_sal||' for empno '||v_empno);
IF upper(v_job) = 'MANAGER' THEN
UPDATE emp
set sal = sal + (sal * 10/100)
where empno = v_empno;
ELSIF upper(v_job) = 'CLERK' THEN
UPDATE emp
set sal = sal + (sal * 6/100)
where empno = v_empno;
ELSIF upper(v_job) = 'SALESMAN' THEN
UPDATE emp
set sal = sal + (sal * 5/100)
where empno = v_empno;
ELSE
UPDATE emp
set sal = sal + (sal * 2/100)
where empno = v_empno;
END IF;
END LOOP;close c_emp;
COMMIT;
f ln_flag = 'N' then
dbms_output.put_line('Invalid input parameters');
end if;
END;
How to declare the cursor variable....
7/29/2019 PLSQL Complete Reference
40/92
40
%ROWTYPE:
t is used to assign the cursor records structure to a variable. Instead of fetching the values in
o independent local variable we can dump them in to one local variable by declaring the
variable with the data type as cursor%rowtype.
--
Execises:
write a plsql procedure to increase the salary of the employee of the emp
able by 10% if job is manager
6% if job is clerk
5% is job is salesman
2% is any other.
Pass deptno and empno as parameters and do the updation for all the records if the
deptno and empno is passed as null and for the passed combination of deptno,empno
values if there are no records in the query then print the message no data exists for the
passed input values.
Print the old salary and as well new updated salary laong with the employee name and
ob.
Also include no of records getting printed.
EX:
create or replace procedure xx_rk_sal(p_deptno number,p_empno number)
s
cursor c_emp is
elect ename,job,empno,sal
from emp
where deptno =nvl(p_deptno,deptno)
and empno =nvl(p_empno,empno);
ln_flag char(1):='N';
7/29/2019 PLSQL Complete Reference
41/92
41
v_cnt number:=0;
v_newsal number;
r_emp c_emp%rowtype;
begin
open c_emp;
LOOP
FETCH c_emp into r_emp;
EXIT WHEN c_emp%notfound;
ln_flag:='y';
F upper(r_emp.job)='MANAGER'THEN
UPDATE emp
SET sal=sal+(sal*10/100)
WHERE empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*10/100);
ELSIF upper(r_emp.job)='CLERK'THEN
UPDATE emp
et sal= sal+(sal*6/100)
where empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*6/100);ELSIF upper(r_emp.job)='SALESMAN' THEN
UPDATE emp
et sal= sal+(sal*5/100)
where empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*5/100);
ELSE
UPDATE emp
et sal=sal+(sal*2/100)
where empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*2/100);
7/29/2019 PLSQL Complete Reference
42/92
42
end if;
v_cnt:=v_cnt+sql%rowcount;
dbms_output.put_line('old sal was '||r_emp.sal||'for empno is '||r_emp.empno||'and new salary
s'||v_newsal);
end loop;
close c_emp;
commit;
dbms_output.put_line('No of rows updated = '||v_cnt);
F ln_flag ='N' then
dbms_output.put_line('invalid input parameters');
end if;
END;
write a plsql procedure to display all student marks,grade,name,sex,age
details by passing sno as paramter.
f the passed sno is invalid
print the message as Invalid sno passed,if sno is passed as null print all the detials
-write a plsql procedure to display all transaction details by passing acctno as paramter.
f the passed acctno is invalid or
f there are no tansactions for the passed acctno then
print the message as Invalid acctno or no transactions for the [passed
account no...
7/29/2019 PLSQL Complete Reference
43/92
7/29/2019 PLSQL Complete Reference
44/92
44
Exercise:
create or replace procedure xx_rk_sal(p_deptno number,p_empno number)
s
cursor c_emp is
elect ename,job,empno,sal
from emp
where deptno =nvl(p_deptno,deptno)
and empno =nvl(p_empno,empno);
ln_flag char(1):='N';
v_cnt number:=0;
v_newsal number;
r_emp c_emp%rowtype;
begin
FOR r_emp in c_emp
LOOP
n_flag:='Y';
F upper(r_emp.job)='MANAGER'THEN
UPDATE emp
SET sal=sal+(sal*10/100)
WHERE empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*10/100);
ELSIF upper(r_emp.job)='CLERK'THEN
UPDATE emp
7/29/2019 PLSQL Complete Reference
45/92
45
et sal= sal+(sal*6/100)
where empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*6/100);
ELSIF upper(r_emp.job)='SALESMAN' THEN
UPDATE emp
et sal= sal+(sal*5/100)
where empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*5/100);
ELSE
UPDATE emp
et sal=sal+(sal*2/100)
where empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*2/100);
end if;
v_cnt:=v_cnt+sql%rowcount;
dbms_output.put_line('old sal was '||r_emp.sal||'for empno is '||r_emp.empno||'and new salary
s'||v_newsal);
END LOOP;
commit;
dbms_output.put_line('No of rows updated = '||v_cnt);
F ln_flag ='N' then
dbms_output.put_line('invalid input parameters');
end if;
END;
----------------------------------------
7/29/2019 PLSQL Complete Reference
46/92
46
Write a plsql proceudre to increase the salary of the employee of the emp
able by 10% if job is manager
6% if job is clerk
5% is job is salesman
2% is any other
f no of records updated is more then that means
he data will repeatedly updated which is wrong...
whenever this happens donot do any updation just rollback everything...
create or replace procedure xx_rk_sal(p_deptno number,p_empno number)
s
ln_flag char(1):='N';
v_cnt number:=0;
v_newsal number;
u_exp exception;
begin
FOR r_emp in (select ename,job,empno,sal,deptno
from emp
where deptno =nvl(p_deptno,deptno)and empno =nvl(p_empno,empno))
LOOP
n_flag:='Y';
F upper(r_emp.job)='MANAGER'THEN
UPDATE emp
SET sal=sal+(sal*10/100)
WHERE empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*10/100);
ELSIF upper(r_emp.job)='CLERK'THEN
UPDATE emp
7/29/2019 PLSQL Complete Reference
47/92
47
et sal= sal+(sal*6/100)
where deptno = r_emp.deptno;
v_newsal:=r_emp.sal+(r_emp.sal*6/100);
ELSIF upper(r_emp.job)='SALESMAN' THEN
UPDATE emp
et sal= sal+(sal*5/100)
where empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*5/100);
ELSE
UPDATE emp
et sal=sal+(sal*2/100)
where empno = r_emp.empno;
v_newsal:=r_emp.sal+(r_emp.sal*2/100);
end if;
f sql%rowcount > 1 then
raise u_exp;
end if;
v_cnt:=v_cnt+sql%rowcount;
dbms_output.put_line('old sal was '||r_emp.sal||'for empno is '||r_emp.empno||'and new salarys'||v_newsal);
END LOOP;
commit;
dbms_output.put_line('No of rows updated = '||v_cnt);
F ln_flag ='N' then
dbms_output.put_line('invalid input parameters');
end if;
exception
when u_exp then
rollback;
7/29/2019 PLSQL Complete Reference
48/92
48
dbms_output.put_line('no of records updation is greater then 1, please contact IT suppprt
eam');
when others then
dbms_output.put_line('Error in the main procedure '||sqlerrm);
END;
write a plsql procedure to increase the salary of the employee of the emp
able by 10% passing the salgrade as the parameter.Print the emp names ,empno, old
alary and new salary and no of records being updated.if the passed salgrade is invalid
print the appropriate message.
f the value of parameter is null then update all the records
-----------------------------------------------------------------------
Parameterized cursors
Ex: print the dept name and the employees for those deptnames
create or replace procedure xx_dtls(p_deptno number)
s
cursor c_dept is select * from dept where deptno = nvl(p_deptno,deptno);
cursor c_emp(v_deptno number)
s select * from emp where deptno = v_deptno;
begin
for r_dept in c_dept
loop
dbms_output.put_line('----------------------');
dbms_output.put_line(r_dept.dname);
7/29/2019 PLSQL Complete Reference
49/92
49
for r_emp in c_emp(r_dept.deptno)
loop
dbms_output.put_line(r_emp.ename);
end loop;
end loop;
exception
when others then
dbms_output.put_line('Error ins the xx_dtls procedure');
END;
exception
when others then
dbms_output.put_line('Error ins the xx_dtls procedure');
END;
---
Print the deptno details and then print the emp details for each deptno and no of
employees working in that deptno.If no employees working for them then print it as no
employees exists for that deptno.
Take the deptno as parameter and if the value is passed as null then pick all deptno
nformation and if the value passed is invalid then print as invalid deptno passed
Print the subtotal salary for each deptno
Print the total salary for all the deptnos
o/p :
7/29/2019 PLSQL Complete Reference
50/92
50
----------------------Start of the report-----------------------------------------------
The Deptno is 10
The Department Name is Accounting
The Location is Newyork
The ename is rakesh patel
The empno is 1234
The salary is 1000
------
The ename is ankul
The empno is 123
The salary is 1000
The total salary for deptno 10 is 2000
The total no of employees working in the deptno 10 is 2
The total salary for all deptnos is 10000
-------------------------End of the Report -------------------------------------------------
Output :
7/29/2019 PLSQL Complete Reference
51/92
51
create or replace procedure dept_dtls(p_deptno number)
s
cursor c_dept
is select *
from dept_ank
where deptno = nvl(p_deptno,deptno);
cursor c_emp(v_deptno number) /*Parameterised Cursor*/
s select *
from emp_ank
where deptno = v_deptno;
*Variables*/
dept_tot_sal number:=0;
emp_cnt number:=0;
ot_sal number:=0;
v_flag number:=0;
*Execution Section*/
begin
dbms_output.put_line('----------------------Start of the report-------------------------');for r_dept in c_dept
loop
v_flag:=1;
dept_tot_sal:=0;
emp_cnt:=0;
dbms_output.put_line('Department No is: '||r_dept.deptno);
dbms_output.put_line('Department Name is: '||r_dept.dname);
dbms_output.put_line('Department Location is: '||r_dept.loc);
dbms_output.put_line('------------------------------------');
for r_emp in c_emp(r_dept.deptno)
7/29/2019 PLSQL Complete Reference
52/92
52
loop
dbms_output.put_line('Employee Number: '||r_emp.empno);
dbms_output.put_line('Employee Name: '||r_emp.ename);
dbms_output.put_line('Salary: '||r_emp.sal);
dbms_output.put_line('---------------------------------');
dept_tot_sal:=dept_tot_sal+r_emp.sal;
emp_cnt:=emp_cnt+1;
end loop;
if emp_cnt=0 then
dbms_output.put_line('No employee working for department no' ||r_dept.deptno);
else
dbms_output.put_line('The total no of employees working in deptno'||r_dept.deptno|| ' is '
emp_cnt);
dbms_output.put_line('The total salary for deptno'||r_dept.deptno|| ' is ' ||dept_tot_sal);
end if;
dbms_output.put_line('*****************************************************');
ot_sal:=tot_sal+dept_tot_sal;
end loop;
f v_flag=0 thendbms_output.put_line('Invalid department number. Please enter the valid department
number.');
else
dbms_output.put_line('The total salary of all the departments is ' ||tot_sal);
end if;
dbms_output.put_line('--------------------------End of the Report------------------------');
exception
when others then
dbms_output.put_line('Error ins the dept_dtls procedure'||sqlerrm);
END;
7/29/2019 PLSQL Complete Reference
53/92
53
Using a loop in a loop,.
You can use either parameterized cursors or we can use below way as well
create or replace procedure dept_dtls(p_deptno number)
s
*Variables*/
dept_tot_sal number:=0;
emp_cnt number:=0;
ot_sal number:=0;
v_flag number:=0;
*Execution Section*/
begin
dbms_output.put_line('----------------------Start of the report-------------------------');
for r_dept in (select *
from dept_ank
where deptno = nvl(p_deptno,deptno))
loopv_flag:=1;
dept_tot_sal:=0;
emp_cnt:=0;
dbms_output.put_line('Department No is: '||r_dept.deptno);
dbms_output.put_line('Department Name is: '||r_dept.dname);
dbms_output.put_line('Department Location is: '||r_dept.loc);
dbms_output.put_line('------------------------------------');
for r_emp in (select *
from emp_ank
where deptno = r_dept.deptno)
7/29/2019 PLSQL Complete Reference
54/92
54
loop
dbms_output.put_line('Employee Number: '||r_emp.empno);
dbms_output.put_line('Employee Name: '||r_emp.ename);
dbms_output.put_line('Salary: '||r_emp.sal);
dbms_output.put_line('---------------------------------');
dept_tot_sal:=dept_tot_sal+r_emp.sal;
emp_cnt:=emp_cnt+1;
end loop;
if emp_cnt=0 then
dbms_output.put_line('No employee working for department no' ||r_dept.deptno);
else
dbms_output.put_line('The total no of employees working in deptno'||r_dept.deptno|| ' is '
emp_cnt);
dbms_output.put_line('The total salary for deptno'||r_dept.deptno|| ' is ' ||dept_tot_sal);
end if;
dbms_output.put_line('*****************************************************');
ot_sal:=tot_sal+dept_tot_sal;
end loop;
f v_flag=0 thendbms_output.put_line('Invalid department number. Please enter the valid department
number.');
else
dbms_output.put_line('The total salary of all the departments is ' ||tot_sal);
end if;
dbms_output.put_line('--------------------------End of the Report------------------------');
exception
when others then
dbms_output.put_line('Error ins the dept_dtls procedure'||sqlerrm);
END;
7/29/2019 PLSQL Complete Reference
55/92
55
--
Ex:
----------------------------
2)Print the account details and print the transaction details for each accno and no of
ransactions takes palce for each accno. Pass the accno as parameter and if the accno
parameter value is passed as null then print for all accnos else if it is passed and if
hat accno is invalid then print the appro[riate message as invalid parameter value.
Different modes of parameters:
N : The default parameter is IN. the value should be passed in to procedure mandatory.
OUT: Need to pass some variable where using out mode we can fetch the value from the
procedure
NOUT: Pass the input values and assign some other value in the procedure and print it
outside the procedure by fetching it in to variable.
create or replace procedure p_dept_dtls(p_deptno number,p_count out number)s
cursor c_emp
s
elect *
from emp
where deptno=nvl(p_deptno,deptno);
n_flag char(1):= 'N';
n_cnt number:= 0;
begin
for r_emp in c_emp
7/29/2019 PLSQL Complete Reference
56/92
56
loop
ln_flag := 'Y';
ln_cnt := ln_cnt+1;
dbms_output.put_line('ename is '||r_emp.ename);
end loop;
f ln_flag = 'N' then
dbms_output.put_line('No data exists for the deptno');
end if;
p_count :=ln_cnt;
exception
when others then
dbms_output.put_line('error in the procedure '||sqlerrm);
end;
declare
n_count number:=0;
beginp_dept_dtls(20,ln_count);
dbms_output.put_line('the count is '||ln_count);
end;
create or replace procedure p_emp_out(p_empno number
,p_ename out varchar2
,p_sal out number)
s
BEGIN
BEGIN
7/29/2019 PLSQL Complete Reference
57/92
57
select ename,sal
into p_ename,p_sal
from emp
where empno = p_empno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_ename := null;
p_sal := null;
WHEN OTHERS THEN
dbms_output.put_line('Error in the select statement'||SQLERRM);
END;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error in the main proceudre'||SQLERRM);
END p_emp_out;
declare
ln_ename emp.ename%type;
ln_sal emp.sal%type;
begin
p_emp_out(7369,ln_ename,ln_sal);
dbms_output.put_line('Ename is -->'||ln_ename);
dbms_output.put_line('Salary is -->'||ln_sal);
end;
7/29/2019 PLSQL Complete Reference
58/92
58
nout example
--------------------------
create or replace procedure p_emp_out(p_empno in out number
,p_ename out varchar2
,p_sal out number)
s
BEGIN
BEGIN
select ename,sal
into p_ename,p_sal
from emp
where empno = p_empno;
p_empno := 9999;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_empno := 0000;
p_ename := null;
p_sal := null;WHEN OTHERS THEN
dbms_output.put_line('Error in the select statement'||SQLERRM);
END;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error in the main proceudre'||SQLERRM);
END p_emp_out;
declare
ln_ename emp.ename%type;
7/29/2019 PLSQL Complete Reference
59/92
59
ln_sal emp.sal%type;
ln_empno number := 7369;
begin
p_emp_out(ln_empno,ln_ename,ln_sal);
dbms_output.put_line('Ename is -->'||ln_ename);
dbms_output.put_line('Salary is -->'||ln_sal);
dbms_output.put_line('empno -->'||ln_empno);
end;
Procedures or functions:
t is a collection of sql and plsql blocks of codes used to prevent the representation of coding
by making it occur only one time.
Procedures or functions are stored n the database.
When a call to procedure or functions is made in the database server it loads the current
procedures or functions in to the memory which respond to many requests of the same
equirements.
SYNTAX: CREATE OR REPLACE PROCEDURE
PROCEDURE_NAME(PARAMETERS)
IS
--DECLARE ANY VARIBES,CURSORS ETC.
BEGIN
--ANY ACTION TO BE DONE IN EXECUTABLE SECTION.EXCEPTION SECTION
END PROCEDURE NAME;
7/29/2019 PLSQL Complete Reference
60/92
60
SYNTAX: CREATE OR REPLACE FUNCTION FUNCTION_NAME(PARAMETERS)
RETURN DATATYPE
IS
--DECLARE ANY VARIBES,CUSRSORS ETC.
BEGIN
--ANY ACTION TO BE DONE IN EXECUTABLE SECTION.
RETURN VALUE;
EXCEPTION SECTION
END FUCNTION_NAME;
Ex: write a function to accept dept no as parameter and return the department name.
Create or replace function xx_dept_1(p_deptno number)
Return varchar2
Is
--declaration variables
n_dname dept.dname%type;
Begin
Select dname
Into ln_dnameFrom dept
Where deptno = p_deptno;
Return ln_dname;
Exception
When no_data_found then
Return null;
Dbms_output.put_line(No data found);
When others then
Return null;
Dbms_output.put_line(Error in the xx_dept function||sqlerrm);
7/29/2019 PLSQL Complete Reference
61/92
61
End xx_dept_1;
Execution of a functions:
Method1: select xx_dept_1(10) from dual;
Method2: declare
Ln_val varchar2(100);
Begin
Ln_val := xx_dept_1(0);
Dbms_output.put_line(ln_val);
End;
9652203300
1) Write a function to print grade of the employee by passing empno.2) Write a function to print the ename of the employee by passing empno.3) Write a function to print the student grade by passing std no.4)
Write a function to print the sum of salaries for the passed deptno parameter.
5) Write as function to print the salary by deducting 7.65% from that salary by passingemp no.
6) Write a function to print the 3 highest paid employee name no parameters to bepassed.
7) Write a function to print the total deposited amount from the trx_table by passingaccno.
Packages:
They are nothing but clubbing of functions, procedures as one unit.
t consists of 2 parts:
7/29/2019 PLSQL Complete Reference
62/92
62
1) Package Specification:
In this section we declare the functions, procedures etc.
2) Package Body:
We write the procedure, functions body which is declared in the package specification.
Note: when the procedure or functions are declared in the package specification, their body
must be written in the package body.
Syntax:
Create or replace package Package_name
Is
Begin
Procedure p1(parameters);
Function f1(parameters) return number;
Procedure p2(parameters);
End;
Create or replace package body package_nameIs
Procedure p1(parameters)
Is
Begin
-----action;
End p1;
--
Procedure p2(parameters)
Is
Begin
7/29/2019 PLSQL Complete Reference
63/92
63
-----action;
End p2;
fucntion f1(parameters)
Is
Begin
-----action;
End f1;
End package_name;
----------------------------------------------------
EX1:
CREATE OR REPLACE PACKAGE XX_EMP_PKG
IS
PROCEDURE P_EMP_DTLS(P_DEPTNO NUMBER);
FUNCTION F_SALGRADE(P_EMPNO NUMBER) RETURN VARCHAR2;
PROCEDURE P_OUTPUT(P_STRING VARCHAR2);
END XX_EMP_PKG;
CREATE OR REPLACE PACKAGE BODY XX_EMP_PKG
S
FUNCTION F_SALGRADE(P_EMPNO NUMBER)
RETURN VARCHAR2
s
v_grade salgrade_ank.grade%type;
begin
select grade
into v_grade
7/29/2019 PLSQL Complete Reference
64/92
64
from salgrade_ank sg, emp_ank e
where e.empno = p_empno
and e.sal between sg.lowsal and sg.highsal;
return v_grade;
exception
when no_data_found then
return null;
P_OUTPUT ('No data found');
when others then
return null;
P_OUTPUT ('Error in the F_SALGRADE function'||sqlerrm);
end F_SALGRADE;
-
PROCEDURE P_EMP_DTLS(P_DEPTNO NUMBER)
S
cursor c_dept is select * from dept_ank where deptno = nvl(p_deptno,deptno);
cursor c_emp(v_deptno number) /*Parameterised Cursor*/
s select * from emp_ank where deptno = v_deptno;
*Variables*/
dept_tot_sal number:=0;
emp_cnt number:=0;
ot_sal number:=0;
v_flag number:=0;
*Execution Section*/
begin
7/29/2019 PLSQL Complete Reference
65/92
65
P_OUTPUT ('----------------------Start of the report-------------------------');
P_OUTPUT ('----------------------Start of the report-------------------------');
for r_dept in c_dept
loop
v_flag:=1;
dept_tot_sal:=0;
emp_cnt:=0;
P_OUTPUT ('Department No is: '||r_dept.deptno);
P_OUTPUT ('Department Name is: '||r_dept.dname);
P_OUTPUT ('Department Location is: '||r_dept.loc);
P_OUTPUT ('------------------------------------');
for r_emp in c_emp(r_dept.deptno)
loop
P_OUTPUT ('Employee Number: '||r_emp.empno);
P_OUTPUT ('Employee Name: '||r_emp.ename);
P_OUTPUT ('Salary: '||r_emp.sal);
P_OUTPUT ('------');dept_tot_sal:=dept_tot_sal+r_emp.sal;
emp_cnt:=emp_cnt+1;
end loop;
if emp_cnt=0 then
P_OUTPUT ('No employee working for department no' ||r_dept.deptno);
else
P_OUTPUT ('The total no of employees working in deptno'||r_dept.deptno|| ' is ' ||emp_cnt);
end if;
P_OUTPUT ('The total salary for deptno'||r_dept.deptno|| ' is ' ||dept_tot_sal);
P_OUTPUT ('*****************************************************');
7/29/2019 PLSQL Complete Reference
66/92
66
ot_sal:=tot_sal+dept_tot_sal;
end loop;
f v_flag=0 then
P_OUTPUT ('Invalid department number. Please enter the valid department number.');
end if;
f v_flag=1 and p_deptno is null then
P_OUTPUT ('The total salary of all the departments is ' ||tot_sal);
end if;
P_OUTPUT('--------------------------End of the Report------------------------');
exception
when others then
P_OUTPUT('Error in the P_EMP_DTLS procedure'||SQLERRM);END P_EMP_DTLS;
-
PROCEDURE P_OUTPUT(P_STRING VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(P_STRING);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(ERROR IN THE P_OUTPUT
PROCEDURE||SQLERRM);
7/29/2019 PLSQL Complete Reference
67/92
67
END P_OUTPUT;
---
END XX_EMP_PKG;
---------------------------------------------------
EX2: MAKING P_OUTPUT PROCEDURE AS PRVATE PROCEDURE..
CREATE OR REPLACE PACKAGE XX_EMP_PKG
IS
PROCEDURE P_EMP_DTLS(P_DEPTNO NUMBER);
FUNCTION F_SALGRADE(P_EMPNO NUMBER) RETURN VARCHAR2;
END XX_EMP_PKG;
CREATE OR REPLACE PACKAGE BODY XX_EMP_PKG
S
-
PROCEDURE P_OUTPUT(P_STRING VARCHAR2)IS
BEGIN
DBMS_OUTPUT.PUT_LINE(P_STRING);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(ERROR IN THE P_OUTPUT
PROCEDURE||SQLERRM);
END P_OUTPUT;
---
7/29/2019 PLSQL Complete Reference
68/92
68
FUNCTION F_SALGRADE(P_EMPNO NUMBER)
RETURN VARCHAR2
s
v_grade salgrade_ank.grade%type;
begin
select grade
into v_grade
from salgrade_ank sg, emp_ank e
where e.empno = p_empno
and e.sal between sg.lowsal and sg.highsal;
return v_grade;
exception
when no_data_found then
return null;
P_OUTPUT ('No data found');
when others then
return null;P_OUTPUT ('Error in the F_SALGRADE function'||sqlerrm);
end F_SALGRADE;
-
PROCEDURE P_EMP_DTLS(P_DEPTNO NUMBER)
S
cursor c_dept is select * from dept_ank where deptno = nvl(p_deptno,deptno);
cursor c_emp(v_deptno number) /*Parameterised Cursor*/
s select * from emp_ank where deptno = v_deptno;
*Variables*/
7/29/2019 PLSQL Complete Reference
69/92
69
dept_tot_sal number:=0;
emp_cnt number:=0;
ot_sal number:=0;
v_flag number:=0;
*Execution Section*/
begin
P_OUTPUT ('----------------------Start of the report-------------------------');
P_OUTPUT ('----------------------Start of the report-------------------------');
for r_dept in c_dept
loop
v_flag:=1;
dept_tot_sal:=0;
emp_cnt:=0;
P_OUTPUT ('Department No is: '||r_dept.deptno);
P_OUTPUT ('Department Name is: '||r_dept.dname);
P_OUTPUT ('Department Location is: '||r_dept.loc);P_OUTPUT ('------------------------------------');
for r_emp in c_emp(r_dept.deptno)
loop
P_OUTPUT ('Employee Number: '||r_emp.empno);
P_OUTPUT ('Employee Name: '||r_emp.ename);
P_OUTPUT ('Salary: '||r_emp.sal);
P_OUTPUT ('------');
dept_tot_sal:=dept_tot_sal+r_emp.sal;
emp_cnt:=emp_cnt+1;
7/29/2019 PLSQL Complete Reference
70/92
70
end loop;
if emp_cnt=0 then
P_OUTPUT ('No employee working for department no' ||r_dept.deptno);
else
P_OUTPUT ('The total no of employees working in deptno'||r_dept.deptno|| ' is ' ||emp_cnt);
end if;
P_OUTPUT ('The total salary for deptno'||r_dept.deptno|| ' is ' ||dept_tot_sal);
P_OUTPUT ('*****************************************************');
ot_sal:=tot_sal+dept_tot_sal;
end loop;
f v_flag=0 then
P_OUTPUT ('Invalid department number. Please enter the valid department number.');
end if;
f v_flag=1 and p_deptno is null then
P_OUTPUT ('The total salary of all the departments is ' ||tot_sal);end if;
P_OUTPUT('--------------------------End of the Report------------------------');
exception
when others then
P_OUTPUT('Error in the P_EMP_DTLS procedure'||SQLERRM);
END P_EMP_DTLS;
-
7/29/2019 PLSQL Complete Reference
71/92
7/29/2019 PLSQL Complete Reference
72/92
72
select ename,sal
into p_ename,p_sal
from emp
where empno = p_empno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_ename := null;
p_sal := null;
WHEN OTHERS THEN
P_OUTPUT('Error in the select statement'||SQLERRM);
END;
EXCEPTION
WHEN OTHERS THEN
P_OUTPUT('Error in the main proceudre'||SQLERRM);
END p_emp_out;
--
FUNCTION F_SALGRADE(P_EMPNO NUMBER)RETURN VARCHAR2
s
v_grade salgrade_ank.grade%type;
begin
select grade
into v_grade
from salgrade_ank sg, emp_ank e
where e.empno = p_empno
and e.sal between sg.lowsal and sg.highsal;
7/29/2019 PLSQL Complete Reference
73/92
73
return v_grade;
exception
when no_data_found then
return null;
P_OUTPUT ('No data found');
when others then
return null;
P_OUTPUT ('Error in the F_SALGRADE function'||sqlerrm);
end F_SALGRADE;
-
PROCEDURE P_EMP_DTLS(P_DEPTNO NUMBER)
S
cursor c_dept is select * from dept_ank where deptno = nvl(p_deptno,deptno);
cursor c_emp(v_deptno number) /*Parameterised Cursor*/
s select * from emp_ank where deptno = v_deptno;
*Variables*/
dept_tot_sal number:=0;emp_cnt number:=0;
ot_sal number:=0;
v_flag number:=0;
LN_GRADE VARCHAR2(1);
LN_ENAME EMP.ENAME%TYPE;
LN_SAL EMP.SAL%TYPE;
*Execution Section*/
begin
7/29/2019 PLSQL Complete Reference
74/92
74
P_OUTPUT ('----------------------Start of the report-------------------------');
P_OUTPUT ('----------------------Start of the report-------------------------');
for r_dept in c_dept
loop
v_flag:=1;
dept_tot_sal:=0;
emp_cnt:=0;
P_OUTPUT ('Department No is: '||r_dept.deptno);
P_OUTPUT ('Department Name is: '||r_dept.dname);
P_OUTPUT ('Department Location is: '||r_dept.loc);
P_OUTPUT ('------------------------------------');
for r_emp in c_emp(r_dept.deptno)
loop
--CALLING THE FUNCTION INORDER TO FETCH THE SALGRADE OF A
EMPLOYEE
LN_GRADE := F_SALGRADE(r_emp.empno);
--CALLING THE PROCEDURE TO FETCH DETIALS.p_emp_out(r_emp.empno,LN_ENAME,LN_SAL);
P_OUTPUT ('TEST PROVATE PROC Employee NAME: '|| LN_ENAME);
P_OUTPUT ('TEST PROVATE PROC SAL: '|| LN_SAL);
P_OUTPUT ('Employee Number: '||r_emp.empno);
P_OUTPUT ('Employee Name: '||r_emp.ename);
P_OUTPUT ('Salary: '||r_emp.sal);
P_OUTPUT (SALGRADE IS : '|| LN_GRADE);
P_OUTPUT ('------');
dept_tot_sal:=dept_tot_sal+r_emp.sal;
emp_cnt:=emp_cnt+1;
7/29/2019 PLSQL Complete Reference
75/92
75
LN_GRADE := NULL;
end loop;
if emp_cnt=0 then
P_OUTPUT ('No employee working for department no' ||r_dept.deptno);
else
P_OUTPUT ('The total no of employees working in deptno'||r_dept.deptno|| ' is ' ||emp_cnt);
end if;
P_OUTPUT ('The total salary for deptno'||r_dept.deptno|| ' is ' ||dept_tot_sal);
P_OUTPUT ('*****************************************************');
ot_sal:=tot_sal+dept_tot_sal;
end loop;
f v_flag=0 then
P_OUTPUT ('Invalid department number. Please enter the valid department number.');
end if;
f v_flag=1 and p_deptno is null thenP_OUTPUT ('The total salary of all the departments is ' ||tot_sal);
end if;
P_OUTPUT('--------------------------End of the Report------------------------');
exception
when others then
P_OUTPUT('Error in the P_EMP_DTLS procedure'||SQLERRM);
END P_EMP_DTLS;
-
END XX_EMP_PKG;
7/29/2019 PLSQL Complete Reference
76/92
7/29/2019 PLSQL Complete Reference
77/92
7/29/2019 PLSQL Complete Reference
78/92
78
collections can have only one dimension, you can model multi-dimensional arrays by
creating collections whose elements are also collections.
*To use collections in an application, you define one or more PL/SQL types, then define
variables of those types. You can define collection types in a procedure, function, or
package. You can pass collection variables as parameters, to move data between client-side
applications and stored subprograms.
To look up data that is more complex than single values, you can store PL/SQL records or
SQL object types in collections. Nested tables and varrays can also be attributes of object
ypes.
*(REFERENCE FROMhttp://docs.oracle.com/cd/B10500_01) USED IN THIS ANSWER
BY RAKESH PATEL.)
PL/SQL offers these collection types:
Index-by tables, also known as associative arrays, let you look up elementsusing arbitrary numbers and strings for subscript values. (They are similar
to hash tables in other programming languages.)
Nested tables hold an arbitrary number of elements. They use sequentialnumbers as subscripts. You can define equivalent SQL types, allowing nested
tables to be stored in database tables and manipulated through SQL.
Varrays (short for variable-size arrays) hold a fixed number of elements(although you can change the number of elements at runtime). They use
sequential numbers as subscripts. You can define equivalent SQL types,
allowing varrays to be stored in database tables. They can be stored and
retrieved through SQL, but with less flexibility than nested tables.
http://docs.oracle.com/cd/B10500_01http://docs.oracle.com/cd/B10500_01http://docs.oracle.com/cd/B10500_01http://docs.oracle.com/cd/B10500_017/29/2019 PLSQL Complete Reference
79/92
79
Collection attribute:
Table_type.first
Table_type.last
Table_type.count
Table_type.delete
3) what is difference between record type and table type.
Record Type: This is a user defined data type that groups a bunch of fields togetherinto a single structure. In C the reserved word struct is used to define this.
EX: type t_rec is record(empno emp.empno%type
,dname dept.dname%type
,ename emp.ename%type;
,loc dept.loc%type
,message varchar2(1000));
Table type: is better and more accurately known as a collection or an array. an arrayis typically a list of records ("standard variables"). A collection is typically a list of
objects ("object variables/pointers")
Ex:
ype t1 is table of emp.empno%type index by binary_integer;
ype t1 is table of VARCHAR2(100) index by binary_integer;
ype t1 is table of emp%rowtype index by binary_integer;
ype t1 is table of cursor%rowtype index by binary_integer;
7/29/2019 PLSQL Complete Reference
80/92
80
4) what is bulk binding?
bulk binds" was added to PL/SQL back in Oracle 8i. Bulk binds enable a PL/SQL program
o fetch many rows from a cursor in one call instead of fetching one row at a time. Bulk
binds also allow many similar DML statements to be executed with one call instead of
equiring a separate call for each. For certain types of PL/SQL programs, using bulk binds
will reduce CPU usage and make the code run faster.
A context switch occurs every time the PL/SQL engine calls the SQL engine to parse,
execute, or fetch from a cursor. Since context switches use CPU time, reducing the number
of context switches will reduce the amount of CPU time used. In addition, the SQL engine
can often reduce the number of logical reads required when multiple rows are fetched in one
call. Reducing logical reads also saves CPU time.
Using bulk binding we can reduce the context switched between sql and plsql engines
*(REFERENCE FROMhttp://www.dbspecialists.com/files/presentations/bulk_binds.html
USED IN THIS ANSWER BY RAKESH PATEL.)
5) Difference between bulk collect and forall
Using bulk collect we can fetch the records at once from the sql engine.
Bulk Collect is for quickly loading a cursor generally into a table type variable within a
procedure.
http://www.dbspecialists.com/files/presentations/bulk_binds.htmlhttp://www.dbspecialists.com/files/presentations/bulk_binds.htmlhttp://www.dbspecialists.com/files/presentations/bulk_binds.htmlhttp://www.dbspecialists.com/files/presentations/bulk_binds.html7/29/2019 PLSQL Complete Reference
81/92
81
ex. Fetch curs BULK_COLLECT into table_var LIMIT 200;
FORALL is for processing the table variable once it is loaded. FORALL is much faster than
ooping through a table index.
ex.
FORALL j in t_tbl.first..t_tbl.last
nsert into some_table
values t_tbl(j);
This is much faster than:
For j in t_tbl.first..t_tbl.last loop
nsert into some_table
values t_tbl(j);
end loop;
NOTE: FORALL statement is limited to performing one and only one DML statement.
*(REFERENCE FROMhttp://dba-blog.blogspot.com/2005/08/using-of-bulk-collect-and-
forall-for.htmlUSED IN THIS ANSWER BY RAKESH PATEL.)
http://www.dbapool.com/forumthread/topic_24227.htmlhttp://dba-blog.blogspot.com/2005/08/using-of-bulk-collect-and-forall-for.htmlhttp://dba-blog.blogspot.com/2005/08/using-of-bulk-collect-and-forall-for.htmlhttp://dba-blog.blogspot.com/2005/08/using-of-bulk-collect-and-forall-for.htmlhttp://dba-blog.blogspot.com/2005/08/using-of-bulk-collect-and-forall-for.htmlhttp://dba-blog.blogspot.com/2005/08/using-of-bulk-collect-and-forall-for.htmlhttp://www.dbapool.com/forumthread/topic_24227.html7/29/2019 PLSQL Complete Reference
82/92
82
Ex:
create or replace procedure xx_emp_dtls(p_deptno number)
s
cursor c_emp
is select empno,ename,sal
from emp
where deptno = nvl(p_deptno,deptno);
ype t_emp is table of c_emp%rowtype index by binary_integer;
r_emp t_emp;
begin
open c_emp;
fetch c_emp bulk collect into r_emp;
close c_emp;
for i in 1..r_emp.count
loop
dbms_output.put_line('ename'||r_emp(i).ename);
for r_dept in (select dname from dept where deptno = r_emp(i).deptno)
loop
dbms_output.put_line('dname is '||r_dept.dname);
end loop;
end loop;
exception
when others then
dbms_output.put_line('Error in the main procedure'||sqlerrm);
End xx_emp_dtls;
7/29/2019 PLSQL Complete Reference
83/92
7/29/2019 PLSQL Complete Reference
84/92
84
end loop;
r_emp.delete;
end loop;
exception
when others then
dbms_output.put_line('Error in the main procedure'||sqlerrm);
End xx_emp_dtls;
create or replace procedure xx_emp_dtls(p_deptno number)
s
cursor c_dept
s select deptno,dname,loc
from dept
where deptno = nvl(p_deptno,deptno);
cursor c_emp(v_deptno number)
is select empno,ename,salfrom emp
where deptno = v_deptno;
ype t_dept is table of c_dept%rowtype index by binary_integer;
r_dept t_dept;
ype t_emp is table of c_emp%rowtype index by binary_integer;
r_emp t_emp;
begin
open c_dept;
fetch c_dept bulk collect into r_dept;
close c_dept;
7/29/2019 PLSQL Complete Reference
85/92
7/29/2019 PLSQL Complete Reference
86/92
86
where deptno = v_deptno;
type t_dept is table of c_dept%rowtype index by binary_integer;
r_dept t_dept;
type t_emp is table of c_emp%rowtype index by binary_integer;
r_emp t_emp;
begin
open c_dept;
fetch c_dept bulk collect into r_dept;
close c_dept;
for i in 1..r_dept.count
loop
dbms_output.put_line('dname is '||r_dept(i).dname);
open c_emp(r_dept(i).deptno);
fetch c_emp bulk collect into r_emp;
close c_emp;
for j in 1.. r_emp.count
loop
dbms_output.put_line('ename'||r_emp(j).ename);
end loop;r_emp.delete;
end loop;
FORALL i in 1..r_dept.count
-- insert into xx_dept_test values r_dept(i);
insert into (select deptno,dname,loc
from x_dept_test1) values r_dept(i);
exception
when others then
dbms_output.put_line('Error in the main procedure'||sqlerrm);
End xx_emp_dtls;
7/29/2019 PLSQL Complete Reference
87/92
7/29/2019 PLSQL Complete Reference
88/92
88
1 t1;
ype t_ref is REF CURSOR;
_ref t_ref;
begin
IF p_flag = 'Y' then
OPEN r_ref for select empno,ename,sal,nvl(comm,100),dname
from emp e,dept d
where e.deptno = d.deptno
and sal 5000;
END IF;
FETCH r_ref bulk collect into r1;
close r_ref;
FOR I in 1..r1.count
LOOPDBMS_OUTPUT.PUT_LINE('Ename -->'||r1(i).ename);
DBMS_OUTPUT.PUT_LINE('salary -->'||r1(i).sal);
DBMS_OUTPUT.PUT_LINE('dname -->'||r1(i).dname);
DBMS_OUTPUT.PUT_LINE('comm -->'||r1(i).comm);
END LOOP;
exception
when others then
DBMS_OUTPUT.PUT_LINE('Error ocured in procedure'||SQLERRM);
END ;
7/29/2019 PLSQL Complete Reference
89/92
89
7) What is execute immediate?
The EXECUTE IMMEDIATE statement executes a dynamic SQL statement or anonymous
PL/SQL block. You can use it to issue SQL statements that cannot be represented directly in
PL/SQL, or to build up statements where you do not know all the table names, WHERE
clauses, and so on in advance.
CREATE OR REPLACE procedure emp_dtls_dynamic(p_flag IN varchar2)
s
ype t_rec is RECORD (empno emp.empno%type
,ename emp.ename%type
,sal emp.sal%type
,comm emp.comm%type
,dname dept.dname%type);
ype t1 is table of t_rec index by binary_integer;
1 t1;
ype t_ref is REF CURSOR;
_ref t_ref;
n_flag char(1):='N';begin
IF p_flag = 'Y' then
OPEN r_ref for select empno,ename,sal,nvl(comm,100),dname
from emp e,dept d
where e.deptno = d.deptno
and sal
7/29/2019 PLSQL Complete Reference
90/92
90
and sal > 2000;
END IF;
FETCH r_ref bulk collect into r1;
close r_ref;
FOR I in 1..r1.count
LOOP
ln_flag := 'Y';
DBMS_OUTPUT.PUT_LINE('Ename -->'||r1(i).ename);
DBMS_OUTPUT.PUT_LINE('salary -->'||r1(i).sal);
DBMS_OUTPUT.PUT_LINE('dname -->'||r1(i).dname);
DBMS_OUTPUT.PUT_LINE('comm -->'||r1(i).comm);
END LOOP;
if ln_flag = 'Y' then
execute immediate 'truncate table emp_backup1';
else
dbms_output.put_line('No data found');
end if;
FORALL i in 1..r1.count
insert into emp_backup1 values r1(i);commit;
exception
when others then
DBMS_OUTPUT.PUT_LINE('Error ocured in procedure'||SQLERRM);
END ;
7/29/2019 PLSQL Complete Reference
91/92
7/29/2019 PLSQL Complete Reference
92/92
execute immediate v_sql bulk collect into r1 using p_deptno ;
FOR I in 1..r1.count
LOOP
ln_flag := 'Y';
DBMS_OUTPUT.PUT_LINE('Ename -->'||r1(i).ename);
DBMS_OUTPUT.PUT_LINE('salary -->'||r1(i).sal);
DBMS_OUTPUT.PUT_LINE('dname -->'||r1(i).dname);
DBMS_OUTPUT.PUT_LINE('comm -->'||r1(i).comm);
END LOOP;
if ln_flag = 'Y' then
execute immediate 'truncate table emp_backup1';
else
dbms_output.put_line('No data found');
end if;
FORALL i in 1..r1.count
insert into emp_backup1 values r1(i);
commit;
exception
when others thenDBMS_OUTPUT.PUT_LINE('Error ocured in procedure'||SQLERRM);
END ;
*(REFERENCE FROMhttp://docs.oracle.com/cd/B10500 01) USED IN THIS ANSWER
http://docs.oracle.com/cd/B10500_01http://docs.oracle.com/cd/B10500_01http://docs.oracle.com/cd/B10500_01http://docs.oracle.com/cd/B10500_01