Sunteți pe pagina 1din 40

http://placementkit.blogspot.

com/
PL / SQL PROGRAMS
P1. WRITE A NESTED PROGRAM TO ADD AND TO MULTIPLY TWO NUMBERS.
DECLARE
N1 number;
N2 number;
Sum number ;
BEGIN
Sum := N1+N2 ;
<< inner_block >>
DECLARE
Prod number;
BEGIN
Prod := N1 * N2 ;
Dbms_output.put_line( Product Value =
prod );
END inner_block ;
Dbms_output.put_line( Sum Value =
sum);
END;
P2. WRITE A PROGRAM TO CALCULATE THE SIMPLE INTEREST AND COMPUND
INTEREST ,
IF P, N, R ARE GIVEN.
declare
p number(9,2) ;
n number(9,2) ;
r number(9,2) ;
si number(9,2) := 0;
ci number(9,2) := 0;
begin
p := &principal_amount;
n := &no_of_years;
r := &rate_of_interest;
si := p*n*r/100;
ci := p*(1+r/100)**n;
dbms_output.put_line('simple interset ='
si);
dbms_output.put_line('compound interset ='
ci);
end;
SQL> /
Enter value for principal_amount: 10000
old 8: p:=&principal_amount;
new 8: p:=10000;
Enter value for no_of_years: 5
old 9: n:=&no_of_years;
new 9: n:=5;
Enter value for rate_of_interest: 10.5
old 10: r:=&rate_of_interest;
new 10: r:=10.5;
simple interset =5250
compound interset =16474.47
PL/SQL procedure successfully completed.
PROGRAM BASED ON IF LOOP

http://placementkit.blogspot.com/
P3 . Write a program to check greatest of two numbers :
declare
a number(3) :=20;
b number(3) :=10;
begin
if a>b then
dbms_output.put_line('a is the greatest : '
a);
else
dbms_output.put_line('B is the greatest : '
b);
end if;
end;
SQL> /
a is the greatest : 20
PL/SQL procedure successfully completed.
P4. Given 2 sides of a rectangle .Write a program to find out its area is gr
eater than its perimeter or not .
declare
l number;
b number;
ar number;
pr number;
begin
l := &l;
b := &b;
ar := l*b;
pr := 2*(l+b);
if ar > pr then
dbms_output.put_line('the area iS > its perimeter'
'area = ' ar 'perimet
er = ' pr);
else
dbms_output.put_line('the area iS < its perimeter'
' area = ' ar
' perim
eter = ' pr);
end if;
end;
Enter value for l: 10
old 7: l:=&l;
new 7: l:=10;
Enter value for b: 6
old 8: b:=&b;
new 8: b:=6;
the area is > its perimeter area = 60 perimeter = 32
PL/SQL procedure successfully completed.
P5. WRITE A PROGRAM TO INPUT A SINGLE DIGIT NO: CONVERT IT INTO WORDS.
Declare
a number;
t varchar2(10);
begin
a :=&a;
if a=1 then

http://placementkit.blogspot.com/
t := 'one';
elsif a=2 then
t := 'two';
elsif a= 3 then
t := 'three';
elsif a= then
t := 'four';
elsif a=5 then
t := 'five';
elsif a=6 then
t := 'six';
elsif a=7 then
t := 'seven';
elsif a=8 then
t := 'eight';
elsif a=9 then
t := 'nine';
else
t := 'zero';
end if;
dbms_output.put_line(a
end;

'='

t);

Enter value for a: 2


old 5: a:=&a;
new 5: a:=2;
2 = two
PL/SQL procedure successfully completed.
P6 . Write a program to check the given number is +ve or ve :
SQL>
declare
n number(2):=12;
begin
if n>0 then
dbms_output.put_line('the given number is positive'
n);
else
dbms_output.put_line('the given number is negative'
n);
end if;
end;
/
SQL> save posneg.sql
Created file posneg.sql
SQL >The given number is positive 12
PL/SQL procedure successfully completed.
PROGRAM BASED ON NESTED IF LOOP
P7. WRITE A PROGRAM TO INPUT 2 NUMBERS IF THE 1st No >2nd No THEN SWAP
IT, ELSE IF 1st No < 2nd No RAISE IT TO ITS POWER , ELSE DOUBLES IT.
declare
a number(5);
b number(5);

http://placementkit.blogspot.com/
t number(5);
begin
a := &a;
b := &b;
dbms_output.put_line( 'initial value of a = ' a
'b=' b)
if a>b
then
t:= a;
a:= b;
b:=t;
elsIF A<B
then
a:=a**a;
b:=b**b;
ELSE
a:=2*a;
b:=2*b;
end if;
dbms_output.put_line('final value of a = ' a
' b = ' b);
end;
SQL> /
Enter value for a: 4
old 6: a:=&a;
new 6: a:=4;
Enter value for b: 5
old 7: b:=&b;
new 7: b:=5;
initial value of a = 4 b = 5
final value of a = 256 b = 3125
PL/SQL procedure successfully completed.
SQL> /
Enter value for a: 5
old 6: a:=&a;
new 6: a:=5;
Enter value for b: 4
old 7: b:=&b;
new 7: b:=4;
initial value of a = 5 b = 4
final value of a = 4 b = 5
PL/SQL procedure successfully completed.
SQL> Enter value for a: 5
old 6: a:=&a;
new 6: a:=5;
Enter value for b: 5
old 7: b:=&b;
new 7: b:=5;
initial value of a = 5 b = 5
final value of a = 10 b = 10
PL/SQL procedure successfully completed.
P8. A bank accepts fixed deposits for one or more years and the policy it ad

http://placementkit.blogspot.com/
opts on interest is as follows:
If a deposit is < Rs 2000 and for 2 or more years , the interest rat
e is 5% compounded annually.
If a deposit is Rs.2000 or more but less than 6000 and for 2 or more
years , the interest is 7 % compounded annually.
If a deposit is Rs.6000 and for 1 or more years , the interest is 8
% compounded annually.
On all deposits for 5 years or more , interest is 10% compounded ann
ually.
On all other deposits not covered by above conditions , the interest
is 3% compounded annually.
Given the amount deposited and the number of years , Write a program to calc
ulate the amount on maturity.
declare
p number(9,2);
r number(9,2);
t number(9,2);
ci number(9,2);
begin
p := &p;
t := &t;
if p<2000 and t>=2 then
r := 5;
elsif p>=2000 and p<6000 and t>=2 then
r := 7;
elsif p>6000 and t>=1 then
r := 8;
elsif t>=5 then
r := 10;
else
r := 3;
end if;
ci := p*(1+r/100)**t - p;
dbms_output.put_line('The Principal amount is ='
p);
dbms_output.put_line('The rate of interest is =' r);
dbms_output.put_line('The time period is =' t);
dbms_output.put_line('The compund interst is =' ci);
end;
Enter value for p: 10000
old 7: p:=&p;
new 7: p:=10000;
Enter value for t: 5
old 8: t:=&t;
new 8: t:=5;
The Principal amount is =10000
The rate of interest is =8
The time period is =5
The compund interst is =4693.28
PL/SQL procedure successfully completed.

Enter value for p: 1500

http://placementkit.blogspot.com/
old 7: p:=&p;
new 7: p:=1500;
Enter value for t: 3
old 8: t:=&t;
new 8: t:=3;
The Principal amount is =1500
The rate of interest is =5
The time period is =3
The compound interest is =236.44
PL/SQL procedure successfully completed.
P9. WRITE A PROGRM TO INPUT 3 NUMBERS FIND THE 1st Greatest, 2nd Greatest,
3rd Greatest.
declare
a number(3);
b number(3);
c number(3);
f number(3);
s number(3);
t number(3);
begin
a :=&a;
b :=&b;
c :=&c;
if a>b and a>c then
f:= a;
if b>c then
s:=b;
t:=c;
else
s:=c;
t:=b;
end if;
elsif b>a and b>c then
f:= b;
if a>c then
s:=a;
t:=c;
else
s:=c;
t:=a;
end if;
else
f:= c;
if a>b then
s:=a;
t:=b;
else
s:=b;
t:=a;
end if;
end if;
dbms_output.put_line('first largest = '
f);

http://placementkit.blogspot.com/
dbms_output.put_line('second largest = '
s);
dbms_output.put_line('third largest = '
t);
end;
/
Enter value for a: 5
old 9: a:=&a;
new 9: a:=5;
Enter value for b: 8
old 10: b:=&b;
new 10: b:=8;
Enter value for c: 9
old 11: c:=&c;
new 11: c:=9;
first largest = 9
second largest = 8
third largest = 5
PL/SQL procedure successfully completed.
P10 . WRITE A PROGRAM TO INPUT 2 NUMBERS AND AN OPERATOR , AND
DISPLAY THE RESULT.
declare
a number(3) ;
b number(3) ;
c number(3) ;
op char(1) ;
begin
a := &a ;
b := &b ;
op := &op ;
if op='+'
then
c:=a+b;
elsif op='-'
then
c:=a-b;
elsif op='*'
then
c:=a*b;
else
c:=a/b;
end if;
dbms_output.put_line('result=' c);
end;
Enter value for a: 5
old 7: a:=&a;
new 7: a:=5;
Enter value for b: 6
old 8: b:=&b;
new 8: b:=6;
Enter value for op: '*'
old 9: op:=&op;

http://placementkit.blogspot.com/
new 9: op:='*';
result=30
PL/SQL procedure successfully completed.
P11. Write a program to calculate the commission of the sales man.
If salesmade Comm
>10000 500
10000 20000 1000
>20000 1500
declare
sman varchar(10);
sm number(9,2);
com number(9,2);
begin
sman := &sman;
sm := &sm;
if sm > 10000 then
com := 500;
elsif sm > 20000 then
com := 1000;
else
com := 1500;
end if;
dbms_output.put_line(' the sales man name is :' sman);
dbms_output.put_line(' the sales made is :' sm);
dbms_output.put_line(' the sales commission is :' com);
end;
Enter value for sman: 'Mathew'
old 6: sman:=&sman;
new 6: sman:='Mathew';
Enter value for sm: 15000
old 7: sm:=&sm;
new 7: sm:=15000;
The sales man name is :Mathew
The sales made is :15000
The sales commission is :500
PL/SQL procedure successfully completed.
PROGRAM BASED ON WHILE LOOP
P12. TO GENERATE NUMBERS FROM 0 TO 25 IN STEP OF 5
declare
i number :=10 ;
begin
dbms_output.put_line(' THE WHILE LOOP begins');
WHILE I<=25 LOOP
dbms_output.put_line(to_char(i));
i:=i+5;
end loop;
End;
THE WHILE LOOP BEGINS
10
15

http://placementkit.blogspot.com/
20
25
PL/SQL procedure successfully completed.
P13. Write a program to find the sum of the digits of the number:
DECLARE
N number ;
S NUMBER :=0;
R NUMBER;
begin
n:=&N;
WHILE N<>0 LOOP
R := MOD(N,10);
S := S + R;
N := TRUNC(N/10);
end loop;
dbms_output.put_line('THE SUM OF THE DIGITS = '
S);
end;
SQL> Enter value for n: 375
old 7: n:=&N;
new 7: n:=375;
THE SUM OF THE DIGITS = 15
PL/SQL procedure successfully completed.
PROGRAM BASED ON NESTED WHILE LOOP
PROGRAM BASED ON FOR LOOP
P14. WRITE A PROGRAM CODE TO PRINT THE MULTIPLICATION TABLE OF A GIVEN
NO:
declare
t number(3) := 3;
begin
T := &T;
FOR I IN 1..3 LOOP
dbms_output.put_line(t
'X'
i
'='
i*t );
end loop;
end;
p15. write aprogram to generate even numbers from 2 to 50, and find its sum.
declare
i number(5);
n number(5);
v number(5);
s number(5):=0;
begin
n := &terminal_number;
for i in 1 .. n/2 loop
v := i*2;
s := s+v;
dbms_output.put_line(v);
end loop;
dbms_output.put_line('the sum of numbers from 2 to ' n ' = '
s);
end;
SQL> /

http://placementkit.blogspot.com/
Enter value for terminal_number: 10
old 7: n:=&terminal_number;
new 7: n:=10;
2
4
6
8
10
The sum of numbers from 2 to 10 = 30
PL/SQL procedure successfully completed.
P16 . WRITE A PROGRAM TO GENERATE FIRST 25 TERMS OF THE FIBONACCIS
SERIES.
declare
a number:= 0 ;
b number:= 1;
c number;
begin
dbms_output.put(a ' ' b ' ');
for i in 3..10 loop
c := a + b;
dbms_output.put(c ' ');
a := b;
b := c;
end loop;
dbms_output.put_line(' ');
end;
0 1 1 2 3 5 8 13 21 34
PL/SQL procedure successfully completed.
P17. Write a program to find the factorial of a number :
declare
n number(2);
i number(2);
f number(5):=1;
begin
n :=&n;
for i in 1..n loop
f := f * i;
end loop;
dbms_output.put_line(' the factorial value = ' f);
end;
Enter value for n: 5
old 6: n:=&n;
new 6: n:=5;
the factorial value = 120
PROGRAM BASED ON NESTED FOR LOOP

P18. Write a program to print the following design:

http://placementkit.blogspot.com/
1
12
123
1234
12345
declare
i number ;
j number;
n number;
begin
n :=&n;
for i in 1..n loop
for j in 1..i loop
dbms_output.put(j);
end loop;
dbms_output.put_line(' ');
end loop;
end;
Enter value for n: 5
old 6: n:=&n;
new 6: n:=5;
P19. WRITE A PROGRAM TO DISPLAY NUMBERS OF THE FORM
00000
12345
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
DECLARE
I NUMBER;
J NUMBER ;
K NUMBER;
BEGIN
FOR I IN 0 .. 5 LOOP
FOR J IN 1..5 LOOP
K := I*J;
DBMS_OUTPUT.PUT(K);
END LOOP;
DBMS_OUTPUT. PUT_LINE (' ');
END LOOP;
END;
P20. WRITE A PL/SQL CODE TO ACCEPT THE TEXT AND REVERSE THE GIVEN TEXT.
CHECK THE TEXT IS PALINDROME OR NOT
DECLARE
G VARchar2(20);
r VARchar2(20);
BEGIN
G:='&g';
dbms_output.put_line('THE GIVEN TEXT :' G);
for i in REVERSE 1.. length(G) loop
R:= R substr(G,i,1);

http://placementkit.blogspot.com/
end loop;
dbms_output.put_line('THE REVERSED TEXT :' R);
IF R=G THEN
dbms_output.put_line('THE GIVEN TEXT IS PALINDROME ');
ELSE
dbms_output.put_line('THE GIVEN TEXT IS NOT PALINDROME ');
END IF;
end;
SQL> /
Enter value for g: MALAYALAM
old 5: G:='&g';
new 5: G:='MALAYALAM';
THE GIVEN TEXT :MALAYALAM
THE REVERSED TEXT :MALAYALAM
THE GIVEN TEXT IS PALINDROME
PL/SQL procedure successfully completed.
/
Enter value for g: HELLO
old 5: G:='&g';
new 5: G:='HELLO';
THE GIVEN TEXT :HELLO
THE REVERSED TEXT :OLLEH
THE GIVEN TEXT IS NOT PALINDROME
PL/SQL procedure successfully completed.
P21. Write a program to print the following design:
declare
i number ;
j number;
n number;
k number;
m number;
begin
n := &n;
for i in 1..n loop
for j in 1..n-i loop
dbms_output.put('~');
end loop;
for k in 1..i loop
dbms_output.put(k);
end loop;
for k in reverse 1..i-1 loop
dbms_output.put(k);
end loop;
dbms_output.put_line(' ');
end loop;
end;
Enter value for n: 5
old 8: n:=&n;
new 8: n:=5;
~~~~1
~~~121
~~12321

http://placementkit.blogspot.com/
~1234321
123454321
PL/SQL procedure successfully completed.
P22. Write a program to print the following design :
declare
i number ;
j number;
n number;
k number;
m number;
begin
n := &n;
for i in 1..n loop
for j in 1..n-i loop
dbms_output.put('~');
end loop;
for k in 1..i loop
dbms_output.put(k);
end loop;
for k in reverse 1..i-1 loop
dbms_output.put(k);
end loop;
dbms_output.put_line(' ');
end loop;
for i in reverse 1..n-1 loop
for j in 1..n-i loop
dbms_output.put('~');
end loop;
for k in 1..i loop
dbms_output.put(k);
end loop;
for k in reverse 1. . i-1 loop
dbms_output.put(k);
end loop;
dbms_output.put_line(' ');
end loop;
end;
Enter value for n: 5
old 8: n:=&n;
new 8: n:=5;
~~~~1
~~~121
~~12321
~1234321
123454321
~1234321
~~12321
~~~121
~~~~1
PL/SQL procedure successfully completed.
PROGRAM BASED ON FOR & IF
P23. GENERATE ODD NOS: FROM 1 TO 10 AND FIND ITS SUM.

http://placementkit.blogspot.com/
DECLARE
I NUMBER(4);
S NUMBER(4):=0;
BEGIN
FOR I IN 1..10 LOOP
IF MOD(I,2) <> 0 THEN
S := S+I;
DBMS_OUTPUT.PUT_LINE(I);
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' THE SUM OF ODD NOS FROM 1 TO 10 = '
END;
SQL>/
1
3
5
7
9
THE SUM OF ODD NOS FROM 1 TO 10 = 25
PL/SQL procedure successfully completed.

S);

P24 . WRITE A PROGRAM TO ALL ODD NUMBERS FORM 10 TO 1 IN REVERSE


ORDER.
declare
i number(5);
n number(5);
v number(5);
s number(5) :=0;
begin
S := &STARTING_NUMBER;
n := &terminal_number;
for i in REVERSE S .. N loop
IF MOD (I,2) <>0 THEN
s := s + I;
dbms_output.put_line(I);
end loop;
dbms_output.put_line('the sum of numbers from 2 to ' n ' = '
s);
end;
Enter value for starting number : 1
Old 6: s=&starting_number:1
New 6: s:=1;
Enter value for Terminal_number: 10
old 7: n := &terminal_number;
new 7: n:=10;
9
7
5
3
1
The sum of numbers from 1 to 9 = 25
PL / SQL procedure successfully completed.
P25. Write a program to check the given no: is prime or not:

http://placementkit.blogspot.com/
declare
n number;
i number;
pr number(2):=1;
begin
n:= &n;
for i in 2..n/2 loop
if mod(n,i) = 0 then
pr := 0;
end if;
end loop;
if pr = 1 then
dbms_output.put_line(' the given no: is prime: ' n);
else
dbms_output.put_line(' the given no: is not prime: ' n);
end if;
end;
Enter value for n: 7
old 6: n:=&n;
new 6: n:=7;
the given no: is prime: 7
PL/SQL procedure successfully completed.
SQL> /
Enter value for n: 25
old 6: n:=&n;
new 6: n:=25;
the given no: is not prime: 25
PL/SQL procedure successfully completed.
P26. WRITE A PROGRAM TO PRINT ASCII TABLE :
DECLARE
I NUMBER;
BEGIN
FOR I IN 33..256 LOOP
DBMS_OUTPUT.PUT (( TO_CHAR (I,'000'))
':'
CHR(I)
IF MOD (I, 8) = 0 THEN
DBMS_OUTPUT.PUT_LINE(' ');
END IF;
END LOOP;
END;
033:! 034:" 035:# 036:$ 037:% 038:& 039:' 040:(
041:) 042:* 043:+ 044:, 045:- 046:. 047:/ 048:0
049:1 050:2 051:3 052:4 053:5 054:6 055:7 056:8
249: 250: 251: 252: 253: 254: 255: 256:
:: :: :: :: :: ::
:: :: :: :: :: ::
PL/SQL procedure successfully completed.

' ' );

P27. Write a program to generate prime nos from 1 to 10:

http://placementkit.blogspot.com/
declare
n number;
i number;
pr number;
begin
for n in 1..10 loop
pr:=1;
for i in 2 .. n/2 loop
if mod(n,i) = 0 then
pr := 0;
end if;
end loop;
if pr = 1 then
dbms_output.put_line(n);
end if;
end loop;
end;
1
2
3
5
7
P28 . Write a program to check the square root of a number is prime or not.
declare
n number;
i number;
pr number;
begin
pr := 1;
n := &n;
n := sqrt(n);
for i in 2 .. n/2 loop
if mod(n,i) = 0 then
pr := 0;
end if;
end loop;
if pr = 1 then
dbms_output.put_line('the square root of the given number is prime' n*n);
else
dbms_output.put_line('the square root of the given number is not prime' n*n
);
end if;
end;
SQL> Enter value for n: 81
old 7: n:=&n;
new 7: n:=81;
The square root of the given number is not prime81
PL/SQL procedure successfully completed.
PROGRAM BASED ON LOOP... END LOOP

P29. Write a program to reverse the digits of the number:

http://placementkit.blogspot.com/
DECLARE
N number ;
S NUMBER : = 0;
R NUMBER;
K number;
begin
N := &N;
K := N;
LOOP
EXIT WHEN N = 0 ;
S := S * 10;
R := MOD(N,10);
S := S + R;
N := TRUNC(N/10);
end loop;
dbms_output.put_line( ' THE REVERSED DIGITS '
end;
Enter value for n: 4567
old 7: N:=&N;
new 7: N:=4567;
THE REVERSED DIGITS OF 4567 = 7654
PL/SQL procedure successfully completed.
PROGRAM BASED ON RECORDS

' OF '

'='

S);

P30. WRITE PL/SQL SCRIPT TO CREATE A RECORD TYPE THAT CAN HOLD SALES IN
4 DIFFERENT QUARTERS.
Structure of the table :
SALES ( SNO, NAME, QUAD1, QUAD2, QUAD3, QUAD4 )
SALES2004 ( Q1, Q2, Q3, Q4 )
DECLARE
TYPE SALEREC IS RECORD
( Q1 NUMBER,
Q2 NUMBER,
Q3 NUMBER,
Q4 NUMBER,
);
BEGIN
SREC SALEREC ;
SELECT SUM(QUAD1) , SUM(QUAD2) , SUM(QUAD3), SUM(QUAD4) INTO SREC FROM
SALES
;
INSERT INTO SALES2004 VALUES (SREC.Q1 ,SREC.Q2, SREC.Q3, SREC.Q4);
END;
PROGRAM BASED ON DATABASE INTERACTION
P31 . Write PL/SQL SCRIPT to determine the salary of employee in the EMP tab
le. If salary >7500 give an increment of 15% , otherwise display the message NO
INCREMENT . Get the empno from the user.
DECLARE
ENO EMP.EMPNO%TYPE;
SALARY EMP.SAL%TYPE;
BEGIN
ENO := &ENO;

http://placementkit.blogspot.com/
SELECT SAL INTO SALARY FROM EMP WHERE EMPNO=ENO;
IF SALARY >7500 THEN
UPDATE EMP SET SAL =SAL+SAL* 15/100 WHERE EMPNO=ENO;
ELSE
DBMS_OUTPUT.PUT_LINE(NO INCREMENT)
END IF;
END;
P32 . GIVEN A TABLE STUDENT ( SID INTEGER PRIMARY KEY, NAME CHAR(30),
AGE INTEGER , GPA FLOAT ). WRITE A PL/SQL SCRIPT TO GO THROUGH SID 142857 AND SET ALL GPA UNDER 4.0 TO 4.0 .
DECLARE
TSID STUDENT.SID%TYPE;
TGPA STUDENT.GPA%TYPE;
BEGIN
TSID:=142;
LOOP
EXIT WHEN TSID > 857 ;
SELECT GPA INTO TGPA FROM STUDENT WHERE SID=TSID;
IF TGPA< 4.0 THEN
UPDATE STUDENT SET GPA=4.0 WHERE SID=TSID;
END IF;
TSID:=TSID+1;
END LOOP;
END;
P33 . DISPLAY AVERAGE SALARY , TOTOL NO: OF EMP, AND TOTAL SALARY FOR
FIRST 5 DEPARTMENTS IN EMP TABLE. DEPT NO ARE 10,20,30,40,5090.
DECLARE
DNO NUMBER:=10;
DPNAME DEPT. DNAME%TYPE;
ASAL EMP. SAL%TYPE;
ACOUNT NUMBER;
SSAL EMP. SAL%TYPE;
BEGIN
LOOP
EXIT WHEN DNO > 50;
SELECT DNAME INTO DPNAME FROM DEPT WHERE DEPTNO=DNO;
SELECT AVG(SAL), COUNT(*), SUM(SAL) INTO ASAL, ACOUNT,SSAL
FROM EMP WHERE DEPTNO = DNO;
DBMS_OUTPUT.PUT_LINE( DEPARTMENT NAME
DPNAME);
DBMS_OUTPUT.PUT_LINE( DEPARTMENT COUNT
ACOUNT);
DBMS_OUTPUT.PUT_LINE( AVERAGE SALARY
ASAL);
DBMS_OUTPUT.PUT_LINE( SUM SALARY
SSAL);
DNO := DNO+10;
END LOOP;
END;

http://placementkit.blogspot.com/
P34. WRITE A PL/SQL SCRIPT TO COUNT THE NO: OF EMPLOYEES. IF TOTAL <10
DISPLAY SMALL COMPANY, ELSE IF TOTAL BETWEEN 10-50 DISPLAY MEDIUM
ELSE DISPLAY LARGE
.
DECLARE
TOT NUMBER (3);
BEGIN
SELECT COUNT(*) INTO TOT FROM EMP;
IF TOT <10 THEN
TEXT := SMALL ;
ELSIF TOT<50 THEN
TEXT := MEDIUM;
ELSE
TEXT := LARGE;
END IF;
DBMS_OUTPUT.PUT_LINE( TEXT
COMPANY);
END;
P35. Find the employee drawing minimum salary. Add his details like empno, n
ame, sal into the table newsal, after incrementing Rs.700.
DECLARE
ENO EMP.EMPNO%TYPE;
NAME EMP.ENAME%TYPE;
SALARY EMP.SAL%TYPE;
BEGIN
SELECT EMPNO, ENAME, SAL INTO ENO, NAME, SALARY
FROM EMP WHERE SAL = (SELECT MIN(SAL) FROM EMP);
SALARY := SALARY+700;
INSERT INTO NEWSAL VALUES ( ENO,NAME,SALARY);
END;
P36. Write a program to update the salary of the employee by 25% if he earns
salary >4000, otherwise if salary <4000 update by 10%, else update by 15%.
DECLARE
S NUMBER(8,2) ;
NAME VARCHAR2(10);
BEGIN
NAME:=&NAME;
SELECT SAL INTO S FROM EMP WHERE ENAME = NAME;
IF S >4000 THEN
UPDATE EMP SET SAL := SAL+SAL*20/100 WHERE ENAME=NAME;
ELSIF S<4000
UPDATE EMP SET SAL := SAL+SAL*10/100 WHERE ENAME=NAME;
ELSE
UPDATE EMP SET SAL := SAL+SAL*15/100 WHERE ENAME=NAME;
END IF;
END;
P37 .Write PL/SQL code to increase the sal of an employee by 5% whose salary
is more than 4000 . Get the empno from the user.
DECLARE
ENO NUMBER(4);
BEGIN

http://placementkit.blogspot.com/
ENO := &ENO;
UPDATE EMP SET SAL =SAL+SAL*5/100 WHERE SAL>4000 AND EMPNO=ENO;
END;
P38. GIVEN A TABLE TEMP ( SNO NUMBER(3) , DNO NUMBER,TEXT CHAR (4) .
WRITE A
PL/SQL SCRIPT TO INSERT 10 RECORDS IN TABLE TEMP AS PER THE FOLLOWING
SPECIFICA
TIONS:
SNO DNO TEXT
1 50 ODD
2 100 EVEN
3 150 ODD
DECLARE
SNO NUMBER := 1;
DNO NUMBER ;
TEXT CHAR(5) ;
BEGIN
LOOP
EXIT WHEN SNO > 10;
DNO := SNO * 50;
IF MOD ( SNO, 2 ) = 0
TEXT := EVEN;
ELSE
TEXT := ODD;
INSERT INTO TEMP VALUES (SNO,DNO,TEXT);
SNO := SNO + 1;
END LOOP;
COMMIT;
END;
P39 . Write PL/SQL code to DELETE the record of an employee whose salary is
more than 4000 . Get the empno from the user.
DECLARE
ENO NUMBER(4);
BEGIN
ENO := &ENO;
DELETE FROM EMP WHERE SAL>4000 AND EMPNO=ENO;
END;
P40 .Write PL/SQL code to insert a new record in the table emp after obtaining
values ( empno, ename, hiredate, sal ) from user.
declare
tempno number(4);
tename varchar(10);
thiredate varchar2(12);
tsal number(7,2);
begin
tempno :=&tempno;
tename :='&tename';
thiredate :='&thiredate';
tsal := &tsal;
insert into emp (empno,ename,hiredate,sal) values(tempno,tename,to_date(thir

http://placementkit.blogspot.com/
edate,'DD-mon-yyyy'),tsal);
end;
Enter value for tempno: 8000
old 7: tempno:=&tempno;
new 7: tempno:=8000;
Enter value for tename: mathew
old 8: tename :='&tename';
new 8: tename :='mathew';
Enter value for thiredate: 10-jan-2004
old 9: thiredate :='&thiredate';
new 9: thiredate :='10-jan-2004';
Enter value for tsal: 8000
old 10: tsal := &tsal;
new 10: tsal := 8000;
PL/SQL procedure successfully completed.
P41. WRITE A PROGRAM TO CREATE A EMP %ROWTYPE RECORD .ACCEPT THE
EMPNO FROM
THE USER, AND DISPLAY ALL THE INFORMATION ABOUT THE EMPLOYEE.
declare
erec emp%rowtype;
eno emp.empno%type;
begin
eno := &eno;
select * into erec from emp where empno=eno;
dbms_output.put_line( 'Emp no : ' erec.empno) ;
dbms_output.put_line( 'Name : ' erec.ename) ;
dbms_output.put_line( 'Salary : ' erec.sal);
dbms_output.put_line( 'Deptno : ' erec.deptno);
dbms_output.put_line( 'hiredate: ' erec.hiredate);
dbms_output.put_line( 'job : ' erec.job);
end;
SQL> /
Enter value for eno: 7788
old 5: eno := &eno;
new 5: eno := 7788;
Emp no : 7788
Name : SCOTT
Salary : 1452
Deptno : 20
hiredate: 19-APR-87
job : ANALYST
PL/SQL procedure successfully completed.
PROGRAM BASED ON EXCEPTION
P42. Write PL/SQL script that traps an invalid data type value given and displays a
custom error message.
DECLARE
ENO EMP. EMPNO%TYPE;
SNO VARCHAR2(5);
NAME EMP.ENMAE%TYPE;
BEGIN
SNO := &SNO ;

http://placementkit.blogspot.com/
SELECT EMPNO,ENAME INTO ENO,NAME FROM EMP WHERE EMPNO=SNO;
DBMS_OUTPUT.PUT_LINE ( NAME
ENAME
EMPNO
EMPNO);
EXCEPTION
WHEN INVALID_NUMBER THEN
DBMS_OUTPUT.PUT_LINE(SNO
IS INVALID DATA FOR EMPLOYEE ID);
END;
PROGRAM BASED ON FUNCTIONS
P43 . write a function to create factorial of a number.
CREATE OR REPLACE FUNCTION FACT (N NUMBER)
RETURN NUMBER
IS
I NUMBER(10);
F NUMBER :=1;
BEGIN
FOR I IN 1.. N LOOP
F:= F*I;
END LOOP;
RETURN F;
END;
SQL> /
Function created.
SQL> select fact(8) from dual;
FACT(8)
--------40320
PROGRAM BASED ON PROCEDURES
P44. Write a Procedure to increase the salary for all the employees in the EMP
table :
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- -------7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
14 rows selected.
SQL> create or replace procedure inc(i number)
is
begin
update emp set sal =sal+i;
end;
/
Procedure created.
To execute the procedures in the PL/SQL block:
SQL> declare
begin
inc(100);
end;
/
PL/SQL procedure successfully completed.
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

http://placementkit.blogspot.com/
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1700 300 30
14 rows selected.
P45. WRITE A PROCEDURE TO INCREASE THE SALARY FOR THE SPECIFIED
EMPLOLEE USING EMPNO IN THE EMP TABLE BASED ON THE FOLLOWING
CRITERIA: INCREASE THE SALARY BY 5% FOR CLERKS, 7% FOR SALESMAN , 10%
FOR ANALYST, 20 % FOR MANAGER and 25% FOR PRESIDENT. ACTIVATE USING
PL/SQL BLOCK.
SQL> SELECT * FROM EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPT
7369 SMITH CLERK 7902 17-DEC-80 800 20
CREATE OR REPLACE PROCEDURE DESIGNATION(ENO NUMBER)
IS
BEGIN
UPDATE EMP SET SAL=SAL+SAL*5/100 WHERE JOB ='CLERK' AND EMPNO=ENO;
UPDATE EMP SET SAL=SAL+SAL*7/100 WHERE JOB='SALESMAN' AND EMPNO=ENO;
UPDATE EMP SET SAL=SAL+SAL*10/100 WHERE JOB='ANALYST' AND EMPNO=ENO;
UPDATE EMP SET SAL=SAL+SAL*20/100 WHERE JOB='MANAGER' AND EMPNO=ENO;
UPDATE EMP SET SAL=SAL+SAL*25/100 WHERE JOB='PRESIDENT' AND EMPNO=ENO;
END;
SQL> /
Procedure created.
SQL> DECLARE
2 BEGIN
3 DESIGNATION(7369);
4 END;
5/
PL/SQL procedure successfully completed.
SQL> SELECT * FROM EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPT
7369 SMITH CLERK 7902 17-DEC-80 840 20__

PLSQL Task:
1)Write a PL/SQL block to accept a year input and check whether it is a leap year.
DECLARE
v_YEAR NUMBER(4) := &P_YEAR;
v_REMAINDER1 NUMBER(5,2);
v_REMAINDER2 NUMBER(5,2);
v_REMAINDER3 NUMBER(5,2);
BEGIN
v_REMAINDER1 := MOD(v_YEAR,4);
v_REMAINDER2 := MOD(v_YEAR,100);
v_REMAINDER3 := MOD(v_YEAR,400);
IF ((v_REMAINDER1 = 0 AND v_REMAINDER2 <> 0 ) OR
v_REMAINDER3 = 0) THEN
DBMS_OUTPUT.PUT_LINE(v_YEAR || ' is a leap year');
ELSE
DBMS_OUTPUT.PUT_LINE(v_YEAR || ' is not a leap
year');
END IF;
END;

2)Write a PL/SQL block which will accept the employee number and print the annual_salary as well as
the bonus.
The PL/SQL block should:
Calculate the annual salary as salary * 12
Calculate the bonus as indicated in the following table:
Annual Salary
Bonus
>= 20,000

2000

19,99910,000

1000

<= 9,999

500

DECLARE
V_EMP_ID NUMBER := &EMPLOYEE_ID;
V_SAL NUMBER(7,2);
V_BONUS NUMBER(7,2);
V_ANN_SALARY NUMBER(15,2);
BEGIN
SELECT SALARY INTO V_SAL FROM EMPLOYEES WHERE EMPLOYEE_ID = V_EMP_ID;
V_ANN_SALARY := V_SAL * 12;
DBMS_OUTPUT.PUT_LINE('Annual Salary is : '||V_ANN_SALARY);
IF V_ANN_SALARY >= 20000 THEN
V_BONUS := 2000;
ELSIF V_ANN_SALARY <= 19999 AND V_ANN_SALARY >=10000 THEN
V_BONUS := 1000;
ELSE
V_BONUS := 500;
END IF;
DBMS_OUTPUT.PUT_LINE ('The Bonus is $ ' || TO_CHAR(V_BONUS));
END;

3)Declare a cursor named EMP_CUR to select the employees last name, salary, and hire
date from the EMPLOYEES table
Process each row from the cursor, and if the salary is greater than 15,000 and the hire
date is later than 01-FEB-1988, display the employee name, salary, and hire date in
the format shown in the following sample output:

DECLARE
CURSOR C_EMP_CUR IS
SELECT last_name,salary,hire_date FROM EMPLOYEES;
V_ENAME VARCHAR2(25);
v_SAL NUMBER(7,2);
V_HIREDATE DATE;
BEGIN
OPEN C_EMP_CUR;
FETCH C_EMP_CUR INTO V_ENAME,V_SAL,V_HIREDATE;
WHILE C_EMP_CUR%FOUND
LOOP
IF V_SAL > 15000 AND V_HIREDATE >=
TO_DATE('01-FEB-1988','DD-MON-YYYY') THEN
DBMS_OUTPUT.PUT_LINE (V_ENAME || ' earns '
|| TO_CHAR(V_SAL)|| ' and joined the organization on '
|| TO_DATE(V_HIREDATE,'DD-Mon-YYYY'));
END IF;
FETCH C_EMP_CUR INTO V_ENAME,V_SAL,V_HIREDATE;
END LOOP;
CLOSE C_EMP_CUR;
END;

4)Create a PL/SQL block to retrieve and output the last name and department ID of each employee
from the EMPLOYEES table for those employees whose EMPLOYEE_ID is less than 115.
In the PL/SQL block, use a cursor FOR loop strategy instead of the OPEN / FETCH /CLOSE cursor
methods used in the previous practice.
1. In the declarative section:
Create two associative arrays. The unique key column for both arrays should be of the BINARY
INTEGER data type. One array holds the employees last name and the other holds the department ID.
Declare a counter variable to be used in the executable section
Declare a cursor that selects the last name and department ID for employees whose ID is less than 115
DECLARE
TYPE Table_Ename IS table of employees.last_name%TYPE
INDEX BY BINARY_INTEGER;
TYPE Table_dept IS table of employees.department_id%TYPE
INDEX BY BINARY_INTEGER;
Tename Table_Ename;

Tdept Table_dept;
i BINARY_INTEGER :=0;
CURSOR Namedept IS SELECT last_name,department_id
FROM employees WHERE employee_id < 115;
BEGIN
FOR emprec in Namedept
LOOP
i := i +1;
Tename(i) := emprec.last_name;
Tdept(i) := emprec.department_id;
DBMS_OUTPUT.PUT_LINE ('Employee: ' || Tename(i) ||
' is in department number: ' || Tdept(i));
END LOOP;
END;

5)Create a table:
CREATE TABLE analysis
(ename Varchar2(20), years Number(2), sal Number(8,2)
);
Write a PL/SQL block that handles an exception, as follows:
1. Declare variables for the employee last name, salary, and hire date. Use a substitution
variable for the employee last name. Then, query the employees table for the
last_name, salary, and hire_date of the specified employee.
2. If the employee has been with the organization for more than five years, and if that
employees salary is less than 3,500, raise an exception. In the exception handler,
perform the following:
Output the following information: employee last name and the message due
for a raise, similar to the following:

Insert the last name, years of service, and salary into the analysis table.
3. If there is no exception, output the employee last name and the message not due for a raise, similar
to the following:

Verify the results by querying the analysis table. Use the following test cases to test the PL/SQL block.
LAST_NAM MESSAGE
E

Austin

Not due for a raise

Nayer

Due for a raise

Fripp

Not due for a raise

Khoo

Due for a raise

SET SERVEROUTPUT ON;


DECLARE
E_DUE_FOR_RAISE EXCEPTION;
V_HIREDATE EMPLOYEES.HIRE_DATE%TYPE;
V_ENAME EMPLOYEES.LAST_NAME%TYPE := INITCAP( '& B_ENAME');
V_SAL EMPLOYEES.SALARY%TYPE;
V_YEARS NUMBER(2);
BEGIN
SELECT LAST_NAME,SALARY,HIRE_DATE
INTO V_ENAME,V_SAL,V_HIREDATE
FROM employees WHERE last_name = V_ENAME;
V_YEARS := MONTHS_BETWEEN(SYSDATE,V_HIREDATE)/12;
IF V_SAL < 3500 AND V_YEARS > 5 THEN
RAISE E_DUE_FOR_RAISE;
ELSE
DBMS_OUTPUT.PUT_LINE (' not due for a raise');
END IF;
EXCEPTION
WHEN E_DUE_FOR_RAISE THEN
BEGIN
DBMS_OUTPUT.PUT_LINE (V_NAME || ' due for a raise');
INSERT INTO ANALYSIS(ENAME,YEARS,SAL)
VALUES (V_ENAME,V_YEARS,V_SAL);
END;
END;
/
SELECT * FROM analysis;

6)Create, compile, and invoke the ADD_JOB procedure and review the results.
a) Create a procedure called ADD_JOB to insert a new job into the JOBS table.
Provide the ID and job title using two parameters.
Note: You can create the procedure (and other objects) by entering the code in the
SQL Worksheet area, and then click the Run Script (F5) icon. This creates and
compiles the procedure. To find out whether or not the procedure has any errors,
click the procedure name in the procedure node, and then select Compile from the
pop-up menu.
b) Invoke the procedure with IT_DBA as the job ID and Database
Administrator as the job title. Query the JOBS table and view the results.
c) Invoke your procedure again, passing a job ID of ST_MAN and a job title of
Stock Manager. What happens and why?
a)
CREATE OR REPLACE PROCEDURE add_job(
p_jobid jobs.job_id%type,
p_jobtitle jobs.job_title%type) IS
BEGIN

INSERT INTO job(job_id, job_title)


VALUES(p_jobid, p_jobtitle);
COMMIT;
END add_job;
/
b)
EXECUTE add_job('IT_DBA', 'Database Administrator');
SELECT * FROM jobs;
c)
An exception occurs because there is a Unique key integrity constraint on the
JOB_ID column.
7)7a. Create a procedure called UPD_JOB to update the job title. Provide the job ID and
a new title using two parameters. Include the necessary exception handling if no
update occurs.
CREATE OR REPLACE PROCEDURE upd_job(
p_jobid jobs.job_id%type,
p_jobtitle jobs.job_title%type) IS
BEGIN
UPDATE job
SET job_title = p_jobtitle
WHERE job_id = p_jobid;
IF sql%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20000, 'No job updated');
ELSE
COMMIT;
END IF;
END upd_job;
/
7b) Invoke the procedure to change the job title of the job ID IT_DBA to Data Administrator. Query
the JOBS table and view the results.
EXECUTE add_job('IT_DBA', 'Data Administrator');
SELECT * FROM jobs;
7c) Test the exception-handling section of the procedure by trying to update a job that does not exist.
You can use the job ID IT_WEB and the job title Web Master.
EXECUTE upd_job('IT_WEB', 'Web Master');
SELECT * FROM jobs where job_id = 'IT_WEB';

8) Create a procedure called GET_EMPLOYEE to query the EMPLOYEES table, retrieving the salary
and job ID for an employee when provided with the employee ID.
a) Create a procedure that returns a value from the SALARY and JOB_ID columns for a specified
employee ID. Remove syntax errors, if any, and then recompile the code.
9)Create

and invoke the GET_JOB function to return a job title.


9a) Create and compile a function called GET_JOB to return a job title.
CREATE OR REPLACE FUNCTION get_job (p_jobid IN
jobs.job_id%type)
RETURN jobs.job_title%type IS
v_title jobs.job_title%type;
BEGIN
SELECT job_title
INTO v_title
FROM jobs
WHERE job_id = p_jobid;
RETURN v_title;
END get_job;
/

9b)Create a VARCHAR2 host variable called b_title, allowing a length of 35


characters. Invoke the function with job ID SA_REP to return the value in the
host variable, and then print the host variable to view the result.
VARIABLE b_title VARCHAR2(35)
EXECUTE :b_title := get_job ('SA_REP');
PRINT b_title

10) Create a function called GET_ANNUAL_COMP to return the annual salary computed
from an employees monthly salary and commission passed as parameters.
10 a) Create the GET_ANNUAL_COMP function, which accepts parameter values for the
monthly salary and commission. Either or both values passed can be NULL, but
the function should still return a non-NULL annual salary. Use the following basic
formula to calculate the annual salary:
(salary*12) + (commission_pct*salary*12)
CREATE OR REPLACE FUNCTION get_annual_comp(
p_sal IN employees.salary%TYPE,
p_comm IN employees.commission_pct%TYPE)
RETURN NUMBER IS
BEGIN
RETURN (NVL(p_sal,0) * 12 + (NVL(p_comm,0) * nvl(p_sal,0)
* 12));
END get_annual_comp;
/

10b) Use the function in a SELECT statement against the EMPLOYEES table for
employees in department 30.

SELECT employee_id, last_name,


get_annual_comp(salary,commission_pct) "Annual
Compensation"
FROM employees
WHERE department_id=30
/

11)Create a procedure, ADD_EMPLOYEE, to insert a new employee into the


EMPLOYEES table. The procedure should call a VALID_DEPTID function to check
whether the department ID specified for the new employee exists in the
DEPARTMENTS table.
11a) Create a function called VALID_DEPTID to validate a specified department ID
and return a BOOLEAN value of TRUE if the department exists.
CREATE OR REPLACE FUNCTION valid_deptid(
p_deptid IN departments.department_id%TYPE)
RETURN BOOLEAN IS
v_dummy PLS_INTEGER;
BEGIN
SELECT 1
INTO v_dummy
FROM departments
WHERE department_id = p_deptid;
RETURN TRUE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN FALSE;
END valid_deptid;
11b)

Create the ADD_EMPLOYEE procedure to add an employee to the EMPLOYEES


table. The row should be added to the EMPLOYEES table if the VALID_DEPTID
function returns TRUE; otherwise, alert the user with an appropriate message.
Provide the following parameters:
- first_name
- last_name
- email
- job: Use 'SA_REP' as the default.
- mgr: Use 145 as the default.
- sal: Use 1000 as the default.
- comm: Use 0 as the default.
- deptid: Use 30 as the default.
- Use the EMPLOYEES_SEQ sequence to set the employee_id column.
Set the hire_date column to TRUNC(SYSDATE).
CREATE OR REPLACE PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_email employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT

'SA_REP',
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30)
IS
BEGIN
IF valid_deptid(p_deptid) THEN
INSERT INTO employees(employee_id, first_name,
last_name, email,job_id, manager_id, hire_date, salary, commission_pct,
department_id)
VALUES (employees_seq.NEXTVAL, p_first_name,
p_last_name, p_email,
p_job, p_mgr, TRUNC(SYSDATE), p_sal, p_comm,
p_deptid);
ELSE
RAISE_APPLICATION_ERROR (-20204, 'Invalid department ID.
Try again.');
END IF;
END add_employee;
11c)

Call ADD_EMPLOYEE for the name 'Jane Harris' in department 15,


leaving other parameters with their default values. What is the result?
EXECUTE add_employee('Jane', 'Harris', 'JAHARRIS', p_deptid=> 15);
11d) Add another employee named Joe Harris in department 80, leaving the remaining
parameters with their default values. What is the result?
EXECUTE add_employee('Joe', 'Harris', 'JAHARRIS',
p_deptid=> 80)

12)
1) Create a package specification and body called JOB_PKG, containing a copy of your
ADD_JOB, UPD_JOB, and DEL_JOB procedures as well as your GET_JOB function.
Note: Use the code from your previously saved procedures and functions when
creating the package. You can copy the code in a procedure or function, and then
paste the code into the appropriate section of the package.
a) Create the package specification including the procedures and function headings
as public constructs.
CREATE OR REPLACE PACKAGE job_pkg IS
PROCEDURE add_job (p_jobid jobs.job_id%TYPE, p_jobtitle
jobs.job_title%TYPE);
PROCEDURE del_job (p_jobid jobs.job_id%TYPE);
FUNCTION get_job (p_jobid IN jobs.job_id%type) RETURN
jobs.job_title%type;
PROCEDURE upd_job(p_jobid IN jobs.job_id%TYPE, p_jobtitle
IN jobs.job_title%TYPE);
END job_pkg;
/
SHOW ERRORS

b) Create the package body with the implementations for each of the subprograms.
CREATE OR REPLACE PACKAGE BODY job_pkg IS
PROCEDURE add_job (
p_jobid jobs.job_id%TYPE,
p_jobtitle jobs.job_title%TYPE) IS
BEGININSERT INTO jobs (job_id, job_title)
VALUES (p_jobid, p_jobtitle);
COMMIT;
END add_job;
PROCEDURE del_job (p_jobid jobs.job_id%TYPE) IS
BEGIN
DELETE FROM jobs
WHERE job_id = p_jobid;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20203, 'No jobs
deleted.');
END IF;
END DEL_JOB;
FUNCTION get_job (p_jobid IN jobs.job_id%type)
RETURN jobs.job_title%type IS
v_title jobs.job_title%type;
BEGIN
SELECT job_title
INTO v_title
FROM jobs
WHERE job_id = p_jobid;
RETURN v_title;
END get_job;
PROCEDURE upd_job(
p_jobid IN jobs.job_id%TYPE,
p_jobtitle IN jobs.job_title%TYPE) IS
BEGIN
UPDATE jobs
SET job_title = p_jobtitle
WHERE job_id = p_jobid;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202, 'No job updated.');
END IF;
END upd_job;
END job_pkg;

/
c) Invoke your ADD_JOB package procedure by passing the values IT_SYSAN and
SYSTEMS ANALYST as parameters.
EXECUTE job_pkg.add_job('IT_SYSAN', 'Systems Analyst');
13)Create and invoke a package that contains private and public constructs.

a) Create a package specification and a package body called EMP_PKG that contains
the following procedures and function that you created earlier:
i) ADD_EMPLOYEE procedure as a public construct
ii) GET_EMPLOYEE procedure as a public construct

iii) VALID_DEPTID function as a private construct


CREATE OR REPLACE PACKAGE emp_pkg IS
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_email employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT 'SA_REP',
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30);
PROCEDURE get_employee(
p_empid IN employees.employee_id%TYPE,
p_sal OUT employees.salary%TYPE,
p_job OUT employees.job_id%TYPE);
END emp_pkg;
/

CREATE OR REPLACE PACKAGE BODY emp_pkg IS


FUNCTION valid_deptid(p_deptid IN
departments.department_id%TYPE) RETURN BOOLEAN IS
v_dummy PLS_INTEGER;
BEGIN
SELECT 1
INTO v_dummy
FROM departments
WHERE department_id = p_deptid;
RETURN TRUE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN FALSE;
END valid_deptid;
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_email employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT 'SA_REP',
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30) IS
BEGIN
IF valid_deptid(p_deptid) THEN
INSERT INTO employees(employee_id, first_name,
last_name, email,
job_id, manager_id, hire_date, salary,
commission_pct, department_id)
VALUES (employees_seq.NEXTVAL, p_first_name,
p_last_name, p_email,
p_job, p_mgr, TRUNC(SYSDATE), p_sal, p_comm,
p_deptid);
ELSE
RAISE_APPLICATION_ERROR (-20204, 'Invalid

department ID. Try again.');


END IF;
END add_employee;
PROCEDURE get_employee(
p_empid IN employees.employee_id%TYPE,
p_sal OUT employees.salary%TYPE,
p_job OUT employees.job_id%TYPE) IS
BEGIN
SELECT salary, job_id
INTO p_sal, p_job
FROM employees
WHERE employee_id = p_empid;
END get_employee;
END emp_pkg;
/
b) Invoke

the EMP_PKG.ADD_EMPLOYEE procedure, using department ID 15 for


employee Jane Harris with the email ID JAHARRIS. Because department ID 15
does not exist, you should get an error message as specified in the exception
handler of your procedure.
EXECUTE emp_pkg.add_employee('Jane', 'Harris','JAHARRIS',
p_deptid => 15);

c) Invoke the ADD_EMPLOYEE package procedure by using department ID 80 for


employee David Smith with the email ID DASMITH.
EXECUTE emp_pkg.add_employee('David', 'Smith','DASMITH',
p_deptid => 80);

14)
modify the code for the EMP_PKG package that you created earlier,
and then overload the ADD_EMPLOYEE procedure. Next, you create two overloaded
functions called GET_EMPLOYEE in the EMP_PKG package. You also add a public
procedure to EMP_PKG to populate a private PL/SQL table of valid department IDs and
modify the VALID_DEPTID function to use the private PL/SQL table contents to
validate department ID values. You also change the VALID_DEPTID validation
processing function to use the private PL/SQL table of department IDs. Finally, you
reorganize the subprograms in the package specification and the body so that they are in
alphabetical sequence.
1) Modify the code for the EMP_PKG package that you created in Practice 4 step 2, and
overload the ADD_EMPLOYEE procedure.
a) In the package specification, add a new procedure called ADD_EMPLOYEE that
accepts the following three parameters:
i) First name
ii) Last name
iii) Department ID
CREATE OR REPLACE PACKAGE emp_pkg IS
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,

p_last_name employees.last_name%TYPE,
p_email employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT 'SA_REP',
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30);
/* New overloaded add_employee */
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_deptid employees.department_id%TYPE);
PROCEDURE get_employee(
p_empid IN employees.employee_id%TYPE,
p_sal OUT employees.salary%TYPE,
p_job OUT employees.job_id%TYPE);
END emp_pkg;

b) Implement the new ADD_EMPLOYEE procedure in the package body as follows:


i) Format the email address in uppercase characters, using the first letter of the
first name concatenated with the first seven letters of the last name.
ii) The procedure should call the existing ADD_EMPLOYEE procedure to perform
the actual INSERT operation using its parameters and formatted email to
supply the values.
iii) Click Run Script to create the package. Compile the package.
CREATE OR REPLACE PACKAGE BODY emp_pkg IS
FUNCTION valid_deptid(p_deptid IN
departments.department_id%TYPE) RETURN BOOLEAN IS
v_dummy PLS_INTEGER;
BEGIN
SELECT 1
INTO v_dummy
FROM departments
WHERE department_id = p_deptid;
RETURN TRUE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN FALSE;
END valid_deptid;
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,p_email employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT 'SA_REP',
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30) IS
BEGIN
IF valid_deptid(p_deptid) THEN
INSERT INTO employees(employee_id, first_name, last_name,
email, job_id, manager_id, hire_date, salary,
commission_pct, department_id)

VALUES (employees_seq.NEXTVAL, p_first_name, p_last_name,


p_email, p_job, p_mgr, TRUNC(SYSDATE), p_sal, p_comm,
p_deptid);
ELSE
RAISE_APPLICATION_ERROR (-20204, 'Invalid department ID. Try
again.');
END IF;
END add_employee;
/* New overloaded add_employee procedure */
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_deptid employees.department_id%TYPE) IS
p_email employees.email%type;
BEGIN
p_email := UPPER(SUBSTR(p_first_name, 1,
1)||SUBSTR(p_last_name, 1, 7));
add_employee(p_first_name, p_last_name, p_email, p_deptid =>
p_deptid);
END;
/* End declaration of the overloaded add_employee procedure */
PROCEDURE get_employee(
p_empid IN employees.employee_id%TYPE,
p_sal OUT employees.salary%TYPE,
p_job OUT employees.job_id%TYPE) IS
BEGIN
SELECT salary, job_id
INTO p_sal, p_job
FROM employees
WHERE employee_id = p_empid;
END get_employee;
END emp_pkg;

/
c) Invoke the new ADD_EMPLOYEE procedure using the name Samuel Joplin
to be added to department 30.
EXECUTE emp_pkg.add_employee('Samuel', 'Joplin', 30);
15)In the EMP_PKG package, create two overloaded functions called GET_EMPLOYEE:

15a) In the package specification, add the following functions:


i) The GET_EMPLOYEE function that accepts the parameter called p_emp_id
based on the employees.employee_id%TYPE type. This function
should return EMPLOYEES%ROWTYPE.
ii) The GET_EMPLOYEE function that accepts the parameter called
p_family_name of type employees.last_name%TYPE. This function
should return EMPLOYEES%ROWTYPE.
CREATE OR REPLACE PACKAGE emp_pkg IS
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,

p_last_name employees.last_name%TYPE,
p_email employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT 'SA_REP',
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30);
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_deptid employees.department_id%TYPE);
PROCEDURE get_employee(
p_empid IN employees.employee_id%TYPE,
p_sal OUT employees.salary%TYPE,
p_job OUT employees.job_id%TYPE);
/* New overloaded get_employees functions specs starts here: */
FUNCTION get_employee(p_emp_id employees.employee_id%type)
return employees%rowtype;
FUNCTION get_employee(p_family_name employees.last_name%type)
return employees%rowtype;
/* New overloaded get_employees functions specs ends here. */
END emp_pkg;
15 b)In the package body:

i) Implement the first GET_EMPLOYEE function to query an employee using the


employees ID.
ii) Implement the second GET_EMPLOYEE function to use the equality operator
on the value supplied in the p_family_name parameter
CREATE OR REPLACE PACKAGE emp_pkg IS
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_email employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT 'SA_REP',
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30);
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_deptid employees.department_id%TYPE);
PROCEDURE get_employee(p_empid IN employees.employee_id%TYPE,
p_sal OUT employees.salary%TYPE,
p_job OUT employees.job_id%TYPE);
/* New overloaded get_employees functions specs starts here: */
FUNCTION get_employee(p_emp_id employees.employee_id%type)
return employees%rowtype;
FUNCTION get_employee(p_family_name employees.last_name%type)
return employees%rowtype;
/* New overloaded get_employees functions specs ends here. */
END emp_pkg;

-- package body
CREATE OR REPLACE PACKAGE BODY emp_pkg IS
FUNCTION valid_deptid(p_deptid IN
departments.department_id%TYPE) RETURN BOOLEAN IS
v_dummy PLS_INTEGER;
BEGIN
SELECT 1
INTO v_dummy
FROM departments
WHERE department_id = p_deptid;
RETURN TRUE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN FALSE;
END valid_deptid;
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_email employees.email%TYPE,
p_job employees.job_id%TYPE DEFAULT 'SA_REP',
p_mgr employees.manager_id%TYPE DEFAULT 145,
p_sal employees.salary%TYPE DEFAULT 1000,
p_comm employees.commission_pct%TYPE DEFAULT 0,
p_deptid employees.department_id%TYPE DEFAULT 30) IS
BEGIN
IF valid_deptid(p_deptid) THEN
INSERT INTO employees(employee_id, first_name, last_name,
email, job_id, manager_id, hire_date, salary,
commission_pct, department_id)
VALUES (employees_seq.NEXTVAL, p_first_name, p_last_name,
p_email, p_job, p_mgr, TRUNC(SYSDATE), p_sal, p_comm,
p_deptid);
ELSE
RAISE_APPLICATION_ERROR (-20204, 'Invalid department ID.
Try again.');
END IF;
END add_employee;
PROCEDURE add_employee(
p_first_name employees.first_name%TYPE,
p_last_name employees.last_name%TYPE,
p_deptid employees.department_id%TYPE) IS
p_email employees.email%type;
BEGIN
p_email := UPPER(SUBSTR(p_first_name, 1,
1)||SUBSTR(p_last_name, 1, 7));
add_employee(p_first_name, p_last_name, p_email, p_deptid =>
p_deptid);
END;
PROCEDURE get_employee(
p_empid IN employees.employee_id%TYPE,
p_sal OUT employees.salary%TYPE,
p_job OUT employees.job_id%TYPE) IS
BEGIN

SELECT salary, job_id


INTO p_sal, p_job
FROM employees
WHERE employee_id = p_empid;
END get_employee;
/* New get_employee function declaration starts here */
FUNCTION get_employee(p_emp_id employees.employee_id%type)
return employees%rowtype IS
rec_emp employees%rowtype;
BEGIN
SELECT * INTO rec_emp
FROM employees
WHERE employee_id = p_emp_id;
RETURN rec_emp;
END;
FUNCTION get_employee(p_family_name employees.last_name%type)
return employees%rowtype IS
rec_emp employees%rowtype;
BEGIN
SELECT * INTO rec_emp
FROM employees
WHERE last_name = p_family_name;
RETURN rec_emp;
END;
/* New overloaded get_employee function declaration ends here */
END emp_pkg;
16)Example for utl_file package:
CREATE OR REPLACE PROCEDURE employee_report(
p_dir IN VARCHAR2, p_filename IN VARCHAR2) IS
f UTL_FILE.FILE_TYPE;
CURSOR cur_avg IS
SELECT last_name, department_id, salary
FROM employees outer
WHERE salary > (SELECT AVG(salary)
FROM employees inner
GROUP BY outer.department_id)
ORDER BY department_id;
BEGIN
f := UTL_FILE.FOPEN(p_dir, p_filename,'W');
UTL_FILE.PUT_LINE(f, 'Employees who earn more than average
salary: ');
UTL_FILE.PUT_LINE(f, 'REPORT GENERATED ON ' ||SYSDATE);
UTL_FILE.NEW_LINE(f);
FOR emp IN cur_avg
LOOP
UTL_FILE.PUT_LINE(f,
RPAD(emp.last_name, 30) || ' ' ||
LPAD(NVL(TO_CHAR(emp.department_id,'9999'),'-'), 5) || ' '
||
LPAD(TO_CHAR(emp.salary, '$99,999.00'), 12));
END LOOP;

UTL_FILE.NEW_LINE(f);
UTL_FILE.PUT_LINE(f, '*** END OF REPORT ***');
UTL_FILE.FCLOSE(f);
END employee_report;

S-ar putea să vă placă și