Professional Documents
Culture Documents
PLSQL
PLSQL
vfno number;
begin
vfno:=100;
declare
vsno number;
vtol number;
begin
vsno:=200;
vtol:=vfno+vsno;
display('the total '||vfno||' and '||vsno||' is '||vtol);
end;
display(vfno);
diplay(vsno);
end;
Note:
In this case 'vsno' doesn't display because varible used outside the second block part.
The varible which is declare in second block cannot use first block part area ,but the
variable which is declare in first part can be used in second part.
The second block part ends when we declare end part.
declare
m number:=100;
begin
declare
n number:=200;
tol number;
m number;
begin
m:=300;
n:=400;
tol:=m+n;
display('the tol of m,n is '||tol);
display('the n value is '||n);
display('the inner block m is '||m);
end;
display('the outer block m is '||m);
end;
Note:
If we declare 'm' in both in inner block and outer block and if we assign a value in second block
then the change occurs in the second block 'm' variable only.
To use first block 'm' variable in second block if the second having same 'm' vairable the use
labelled block to use the 'm' in second block.
EX:
Labeled block:
<<block1>>declare
m number:=100;
begin
<<block2>>declare
n number:=200;
tol number;
m number;
begin
block1.m:=300;
m:=500;
n:=400;
tol:=m+n;
display('the tol of m,n is '||tol);
display('the n value is '||n);
display('the inner block m is '||m);
end;
display('the outer block m is '||m);
end;
-----------------------------------------------declare
m number:=250;
begin
display('The value of outter m '||m);
declare
m number:=550;
begin
display('the value of outter m '||m);
end;
display('the value of outter m '||m);
end;
---------------------------------------------------------declare
vename varchar2(10);
vsal number;
vdeptno number;
vgross number;
begin
select ename,sal,deptno into vename,vsal,vdeptno
from emp
where empno=&empno;
vgross:=vsal+vsal*0.45+vsal*0.35-vsal*0.15;
display('The emp details are '||vename||' '||vdeptno||' '||vsal||' '||vgross);
end;
--------------------------------------------------------------
declare
vename varchar2(10);
vsal number;
vdeptno number;
vnetsal number;
begin
select ename,sal,deptno,sal+nvl(comm,0) into vename,vsal,vdeptno,vnetsal
from emp
where empno=&empno;
display('The emp details are '||vename||' '||vdeptno||' '||vsal||' '||vnetsal);
end;
>alter table emp modify ename varchar2(20);
O/p: no problem in execution;
>insert into emp (empno,ename) values (1001,siva rama krishna)
o/p:no problem since the size of column is changed
but the pl/sql cannot execute since in program we used varchar(10) ,
so there wiil error so we use variable attributes.
---------------------------------------------------------------------------------VARIABLE ATTRIBUTES
COLUMN TYPE
declare
vename emp.ename%type;
begin
select ename into vename
from emp
where empno=&empno;
display('the employee name is '||vename);
end;
---------------------------------------------------------------------------------declare
i emp%rowtype;
vnetsal number;
begin
select ename,job,deptno,sal,sal+nvl(comm,0) into i.ename,i.job,i.deptno,i.sal,vnetsal
from emp
where empno=&empno;
display('the employee details are '||i.ename||' '||i.job||' '||i.deptno||' '||i.sal||' '||vnetsal);
end;
-----------------------------------------------------------------------------------ROW TYPE :
declare
i emp%rowtype;
begin
i.empno:=&empno;
FROM EMP
WHERE DEPTNO=VDEPTNO;
I C%ROWTYPE;
J S%ROWTYPE;
VGROSS NUMBER(7,2);
BEGIN
OPEN C;
LOOP
FETCH C INTO I;
EXIT WHEN C%NOTFOUND;
OPEN S(I.DEPTNO);
LOOP
FETCH S INTO J;
EXIT WHEN S%NOTFOUND;
VGROSS:=J.BASIC+J.HRA+J.DA-J.PF;
INSERT INTO EMP_REPORT
VALUES(J.EMPNO,J.ENAME,J.BASIC,J.HRA,J.DA,J.PF,VGROSS,J.DEPTNO);
END LOOP;
IF S%ROWCOUNT>0 THEN
INSERT INTO EMP_REPORT (ECODE) VALUES (NULL);
END IF;
CLOSE S;
END LOOP;
END;
declare
type erec is record
(veno number(4),
vename emp.ename%type,
basic emp.sal%type,
i dept%rowtype,
vgross number(16,2));
e erec;
begin
e.veno:=&empno;
select ename,sal,emp.deptno,dname into
e.vename,e.basic,e.i.deptno,e.i.dname
from emp,dept
where emp.deptno=dept.deptno and empno=e.veno;
e.vgross:=e.basic+e.basic*0.25+e.basic*0.35-e.basic*0.12;
display(e.veno||' '||e.vename||' '||e.basic||' '||e.i.deptno||' '||e.i.dname);
end;
declare
type name is table of
varchar(50)
index by binary_integer;
n name;
begin
n(0):='siva';
n(1):='rama';
n(2):='krsihna';
declare
type pf_info is record
(pfno number(4),
amount number(14,2));
type emp_rec is record
(eid number(4),
name varchar2(20),
basic number(12,2),
pf pf_info);
type etab is table of emp_rec
index by binary_integer;
ctr number(3):=1;
e etab;
begin
for i in (select empno,ename,sal basic,sal*12 pamt from emp where sal>2000)
loop
e(ctr).eid:=i.empno;
e(ctr).name:=i.ename;
e(ctr).basic:=i.basic;
e(ctr).pf.pfno:=i.empno+5;
e(ctr).pf.amount:=i.pamt;
ctr:=ctr+1;
end loop;
display('employee details are:');
for j in 1..e.count
loop
display(e(j).eid||' '||e(j).name||' '||e(j).basic||' '||e(j).pf.pfno||' '||e(j).pf.amount);
end loop;
end;
declare
type name is table of
emp.ename%type index by binary_integer;
type pays is table of
emp.sal%type index by binary_integer;
n name;
p pays;
begin
select ename,sal bulk collect into n,p
from emp;
for i in 1..n.count
loop
display(rpad(n(i),9)||' '||p(i));
end loop;
end;
create or replace procedure proc_bonus
as
cursor cb is
select empno,ename,job,sal+nvl(comm,0) netsal
from emp;
i cb%rowtype;
bonus number;
begin
open cb;
loop
fetch cb into i;
exit when cb%notfound;
if i.job='CLERK'
then bonus:=i.netsal*0.35;
elsif i.job='SALESMAN'
THEN bonus:=i.netsal*0.25;
ELSE
bonus:=i.netsal*0.15;
END IF;
END LOOP;
close cb;
END proc_bonus;
create or replace function feo(n in number,f out number)
return boolean
is
fact number:=1;
begin
if n=0 or n=1 then
f:=1;
else
for i in reverse 1..n
loop
fact:=fact*i;
end loop;
end if;
if mod(n,2)=0 then
return (true);
else
return (false);
end if;
end feo;