0% found this document useful (0 votes)
125 views

PL SQL Programs

This document contains several PL/SQL code blocks demonstrating various programming concepts including: 1) Declaring and initializing variables, performing conditional logic, loops, and database operations like inserts and updates. 2) Examples show the use of IF/THEN/ELSE statements, loops like FOR and WHILE, and flow control statements like EXIT, EXIT WHEN, and GOTO. 3) Various operations are demonstrated like generating a fibonacci series, calculating a factorial, finding the maximum of three numbers, and determining if a number is prime.
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
125 views

PL SQL Programs

This document contains several PL/SQL code blocks demonstrating various programming concepts including: 1) Declaring and initializing variables, performing conditional logic, loops, and database operations like inserts and updates. 2) Examples show the use of IF/THEN/ELSE statements, loops like FOR and WHILE, and flow control statements like EXIT, EXIT WHEN, and GOTO. 3) Various operations are demonstrated like generating a fibonacci series, calculating a factorial, finding the maximum of three numbers, and determining if a number is prime.
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 12

Hello World WHERE employee_id = emp_id;

DECLARE END;
message varchar2(20):= 'Hello, World!'; /
BEGIN
dbms_output.put_line(message);
END; DECLARE
/ sales NUMBER(8,2) := 20000;
bonus NUMBER(6,2);
I\p from User emp_id NUMBER(6) := 120;
declare BEGIN
a number; IF sales > 50000 THEN
begin bonus := 1500;
a := :a; ELSIF sales > 35000 THEN
dbms_output.put_line('Inputed Number is >> '|| a); bonus := 500;
end; ELSE
/ bonus := 100;
END IF;
Select input UPDATE employees SET salary = salary + bonus
DECLARE WHERE employee_id = emp_id;
    i NUMBER := 1; END;
BEGIN /
    LOOP
        INSERT INTO T1 VALUES(i,i);
DECLARE
        i := i+1;
grade CHAR(1);
        EXIT WHEN i>100;
    END LOOP;
BEGIN
END;
grade := 'B';
IF grade = 'A' THEN
If, then, else DBMS_OUTPUT.PUT_LINE('Excellent');
ELSIF grade = 'B' THEN
DECLARE DBMS_OUTPUT.PUT_LINE('Very Good');
sales NUMBER(8,2) := 12100; ELSIF grade = 'C' THEN
quota NUMBER(8,2) := 10000; DBMS_OUTPUT.PUT_LINE('Good');
bonus NUMBER(6,2); ELSIF grade = 'D' THEN
emp_id NUMBER(6) := 120; DBMS_OUTPUT. PUT_LINE('Fair');
BEGIN ELSIF grade = 'F' THEN
IF sales > (quota + 200) THEN DBMS_OUTPUT.PUT_LINE('Poor');
bonus := (sales - quota)/4; ELSE
ELSE DBMS_OUTPUT.PUT_LINE('No such grade');
bonus := 50; END IF;
END IF; ENd;
UPDATE employees SET salary = salary + bonus /
WHERE employee_id = emp_id;
END;
/ DECLARE
a number(3) := 100;
BEGIN
DECLARE IF ( a = 10 ) THEN
sales NUMBER(8,2) := 12100; dbms_output.put_line('Value of a is 10' );
quota NUMBER(8,2) := 10000; ELSIF ( a = 20 ) THEN
bonus NUMBER(6,2); dbms_output.put_line('Value of a is 20' );
emp_id NUMBER(6) := 120; ELSIF ( a = 30 ) THEN
BEGIN dbms_output.put_line('Value of a is 30' );
IF sales > (quota + 200) THEN ELSE
bonus := (sales - quota)/4; dbms_output.put_line('None of the values is matching');
ELSE END IF;
IF sales > quota THEN dbms_output.put_line('Exact value of a is: '|| a );
bonus := 50; END;
ELSE /
bonus := 0;
END IF;
END IF;
DECLARE
UPDATE employees SET salary = salary + bonus
x NUMBER := 100;
BEGIN Aim: To write a pl/sql program to finding factorial of given
FOR i IN 1..10 LOOP number.
IF MOD(i,2) = 0 THEN -- i is even  declare
INSERT INTO temp VALUES (i, x, 'i is even');        i number(4):=1;
ELSE        n number(4):=&n;
INSERT INTO temp VALUES (i, x, 'i is odd');        f number(4):=1;
END IF;  begin
x := x + 100;     for i in 1..n
END LOOP;     loop
COMMIT;        f:=f*i;
END;      end loop;
    Dbms_output.put_line('the factorial of '||n||' is:'||f);
    end;
Max between three no.s    /
Declare
    a number; Aim: To write a pl/sql program to generate fibinocci series.
    b number;
    c number;    declare
Begin       a number(3):=1;
    dbms_output.put_line('Enter a:');       b number(3):=1;
        a:=&a;       c number(3);
    dbms_output.put_line('Enter b:');       n number(3):=&n;
        b:=&b; begin
    dbms_output.put_line('Enter c:');   Dbms_output.put_line('the fibinocci series is:'); 
        c:=&C;   while a<=n
if (a>b) and (a>c)     loop
    then         dbms_output.put_line(a);
    dbms_output.put_line('A is GREATEST'||A);         c:=a+b;
elsif (b>a) and (b>c)         a:=b;
    then         b:=c;
    dbms_output.put_line('B is GREATEST'||B);      end loop;
else   end;
    dbms_output.put_line('C is GREATEST'||C);  /
end if;
End; For Loop

Aim: To write a pl/sql program to check weather given DECLARE


number is Prime or not. a number(2);
BEGIN
Procedure: FOR a in 10 .. 20 LOOP
dbms_output.put_line('value of a: ' || a);
  declare END LOOP;
       num number; END;
       i number:=1; /
       c number:=0;
  begin DECLARE
        num:=&num; x NUMBER := 100;
       for i in 1..num BEGIN
       loop FOR i IN 1..10 LOOP
          if((mod(num,i))=0) IF MOD(i,2) = 0 THEN -- i is even
           then INSERT INTO temp VALUES (i, x, 'i is even');
              c:=c+1; ELSE
         end if; INSERT INTO temp VALUES (i, x, 'i is odd');
      end loop; END IF;
     if(c>2) x := x + 100;
     then END LOOP;
         dbms_output.put_line(num||' not a prime'); COMMIT;
     else END;
        dbms_output.put_line(num||' is prime');
     end if; Exit Statement
  end; DECLARE
   / x NUMBER := 0;
BEGIN
LOOP a number(2) := 10;
DBMS_OUTPUT.PUT_LINE ('Inside loop: x = ' || BEGIN
TO_CHAR(x)); <<loopstart>>
x := x + 1; -- while loop execution
IF x > 3 THEN WHILE a < 20 LOOP
EXIT; dbms_output.put_line ('value of a: ' || a);
END IF; a := a + 1;
END LOOP; IF a = 15 THEN
-- After EXIT, control resumes here a := a + 1;
DBMS_OUTPUT.PUT_LINE(' After loop: x = ' || GOTO loopstart;
TO_CHAR(x)); END IF;
END; END LOOP;
/ END;
/
Exit When
DECLARE BEGIN
x NUMBER := 0;   GOTO label_1;
BEGIN   DBMS_OUTPUT.PUT_LINE('Right after the GOTO
LOOP statement');
DBMS_OUTPUT.PUT_LINE('Inside loop: x = ' ||   <<label_1>>
TO_CHAR(x));   DBMS_OUTPUT.PUT_LINE('It is here!');
x := x + 1; -- prevents infinite loop END;
EXIT WHEN x > 3; /
END LOOP;
-- After EXIT statement, control resumes here Q1: Write a PL/SQL code block to find sum and average
DBMS_OUTPUT.PUT_LINE('After loop: x = ' || of three numbers.
TO_CHAR(x)); declare
END; a number:=&a;
/ b number:=&b;
c number:=&c;
sm number;
While loop av number;
DECLARE begin
a number(2) := 10; sm:=a+b+c;
BEGIN av:=sm/3;
WHILE a < 20 LOOP dbms_output.put_line('Sum = '||sm);
dbms_output.put_line('value of a: ' || a); dbms_output.put_line('Average = '||av);
a := a + 1; end;
END LOOP;
END; Q2: Write a PL/SQL code block to find Simple Interest.
/ declare
p number(9,2);
r number(9,2);
DECLARE
t number(9,2);
  n_counter   NUMBER := 10;
si number(9,2);
  n_factorial NUMBER := 1;
begin
  n_temp      NUMBER;
p:=&p;
BEGIN
r:=&r;
  n_temp := n_counter;
t:=&t;
  WHILE n_counter > 0
si:=(p*r*t)/100;
  LOOP
dbms_output.put_line('Simple Interest = '||si);
    n_factorial := n_factorial * n_counter;
end;
    n_counter   := n_counter - 1;
  END LOOP;
Q3: Write a PL/SQL code block to find area of circles
 
with radius greater than 3 and less than equal to 7 and
  DBMS_OUTPUT.PUT_LINE('factorial of ' || n_temp ||
store the result in a table with attributes radius and
                       ' is ' || n_factorial);
area.
 END;
declare
/
area number(5,2);
radius number(1):=3;
GO TO
pi constant number(3,2):=3.14;
DECLARE begin
while radius<=7 b number:= 1;
loop c number;
area:=pi*radius*radius; begin
insert into areas values (radius,area); dbms_output.put(a||' '||b||' ');
radius:=radius+1; for i in 3..10 loop
end loop; c := a + b;
end; dbms_output.put(c||' ');
a := b;
Q4: Write a PL/SQL code block to find factorial of a b := c;
number. end loop;
declare dbms_output.put_line(' ');
n number; end;
i number;
f number:=1; Q8: Write a PL/SQL code block to find sum of digits of a
begin number.
n:=&n; declare
for i in 1..n N number ;
loop S number:=0;
f:=f*i; R number;
end loop; begin
dbms_output.put_line(n||'! = '||f); N:=&N;
end; WHILE N<>0 LOOP
R := MOD(N,10);
Q5: Write a PL/SQL code block to find reverse of a S := S + R;
number. N := TRUNC(N/10);
declare end loop;
N number; dbms_output.put_line('THE SUM OF THE DIGITS = '||S);
S NUMBER := 0; end;
R NUMBER;
K number; Sum of odd number between 1 to 100
begin Declare
N := &N; NUM number:=1;
K := N; Sum  number:=0;
loop begin
exit WHEN N = 0; loop
S := S * 10; NUM1 := NUM+2;
R := MOD(N,10); Sum:=Sum+Num1;
S := S + R; exit when NUM1=100;
N := TRUNC(N/10); end loop;
end loop; dbms_output.put_line (sum);
dbms_output.put_line('THE REVERSED DIGITS OF '||K||' end;
= '||S);
end; Write a Pl/Sql Program to implement Sum of First 100
Odd and Even Numbers
Q6: Write a PL/SQL code block to find greatest of three declare
numbers. odd number:=0;
declare even number:=0;
a number := &a; i number;
b number := &b; begin
c number := &c; for i in 1..100
begin loop
if a>b and a>c then if(i mod 2=0) then
dbms_output.put_line(a||' is greatest.'); even:=even+i;
elsif b>a and b>c then else
dbms_output.put_line(b||' is greatest.'); odd:=odd+i;
else end if;
dbms_output.put_line(c||' is greatest.'); end loop;
end if; dbms_output.put_line('the sum of 100 even no is'||even);
end; dbms_output.put_line('the sum of 100 odd no is'||odd);
end;
Q7: Write a PL/SQL code block to generate Fibonacci /
series.
declare How to Print Even Number beteen 1 to 100
a number:= 0 ; through SQL
Declare begin
NUM1 number:=0; num1:=&num1;
begin rev:=0;
loop while num1>0
NUM1 := NUM1+2; loop
dbms_output.put_line (NUM1||’,’); num2:=num1 mod 10;
exit when NUM1=100; rev:=num2+(rev*10);
end loop; num1:=floor(num1/10);
end; end loop;
dbms_output.put_line('Reverse number is: '||rev);
PL/SQL Program for Reverse of a Number end;

Aim - PL/SQL Program to reverse a string.


declare
str1 varchar2(30);
len number(3);
str2 varchar2(30);
declare i number(3);
    n number; begin
    i number; str1:='&str1';
    rev number:=0; len:=length(str1);
    r number; for i in reverse 1..len
 begin loop
    n:=&n; str2:=str2 || substr(str1,i,1);
        while n>0 end loop;
    loop dbms_output.put_line('Reverse string is: '||str2);
        r:=mod(n,10); end;
        rev:=(rev*10)+r;
        n:=trunc(n/10); Aim: To Write a pl/sql program to print mark list using
    end loop; cursors.
     dbms_output.put_line('reverse is '||rev);
 end; declare
/     stu student%rowtype;
    total number(4);
PL/SQL Program to Reverse a String     result varchar(4);
    cursor c is select * From student;
begin
  for stu in c
    loop
         Dbms_output.put_line('STUDENT MARKLIST');
         Dbms_output.put_line('----------------------------');
declare
         Dbms_output.put_line('sno:'||stu.sno||' sname:'||
    str1 varchar2(50):='&str';
stu.sname);
    str2 varchar2(50);
         total:=stu.m1+stu.m2+stu.m3;
    len number;
         if stu.M1>35 and stu.M2>35 and stu.M3>35
    i number;
         then
 begin
             result:='pass';
    len:=length(str1);
         else
    
             result:='fail';
    for i in reverse 1..len
         end if;
    loop
          Dbms_output.put_line('m1:'||stu.M1||' m2:'||
        str2:=str2 || substr(str1,i,1);
stu.M2||' m3:'||stu.M3);
    end loop;
          Dbms_output.put_line('total:'||total||' result:'||
        dbms_output.put_line('Reverse of String is:'||str2);
result);
end;
       end loop;
/
end;
/
Aim - PL/SQL Program to accept a number from user
and print number in reverse order. Record from Table
declare Aim: To Write a pl/sql program to to displaying top 10
num1 number(5); employee details based  on salary using cursors
num2 number(5); Source code:
rev number(5);    declare
        i number(2);         dbms_output.put_line('Grade:');
        E emp%rowtype;        case Grd
        cursor ec is select * from emp  order by salary desc;            when 'A' then Dbms_output.Put_line('Very Good');
    begin            when 'B' then Dbms_output.Put_line('Good');
         Dbms_output.put_line('Eno Ename   Job  Salary');            when 'C' then Dbms_output.Put_line('Avrage');
         Dbms_output.put_line('----------------------');           else
        i:=1;            Dbms_output.Put_line('Fail');
       open ec;         end case;
       loop        end;
         fetch ec into E;    /
            i:=i+1;
           Dbms_output.put_line(E.eno||' '||rpad(E.ename,8,' ')||' --EXAMPLE OF SQL%FOUND (IMPLICIT
'|| rpad(E.job,5,' ')||'  '||E.salary); CURSORS)
      exit when i>10 or ec%notfound;
     end loop; To Write a pl/sql program to display employees using
   close ec; parameterized cursor.
  end; Source code:
   /               declare
     n number;
ECLARE       er emp%rowtype;
     cursor c(d number) is
customer_rec customers%rowtype;      select * from emp where emp.eno=d;
begin
BEGIN     n:=&n;
SELECT * into customer_rec     open c(n);
    if c%isopen then
FROM customers       loop
WHERE id = 5;           fetch c into er;
          exit when c%notfound;
dbms_output.put_line('Customer ID: ' || customer_rec.id);              Dbms_output.put_line('Employee No:'||
er.eno
dbms_output.put_line('Customer Name: ' ||
              ||'Employee Name:'||er.ename);
customer_rec.name);
          end loop;
dbms_output.put_line('Customer Address: ' ||       else
customer_rec.address);        DBMS_OUTPUT.PUT_LINE('not found');
      end if;
dbms_output.put_line('Customer Salary: ' ||     close c;
customer_rec.salary); end;
END;   /

/ Aim: To Write a pl/sql program to update the commission


values for all employees with salary less than 2000 by
adding Rs.1000 to existing employees.
Aim:  To write a pl/sql program to display the employee Source code:
details   declare
SQL> declare        cursor c is select *From emp for update;
  2  E emp%rowtype;         emp_rec emp%rowtype;
  3  begin begin
  4  select * into E      for emp_rec in c
  5  from emp      loop
  6  where eno=100;           if emp_rec.salary<2000 then
  7  dbms_output.put_line('eno:'||E.eno);              update emp set comm=comm+1000
  8  dbms_output.put_line('ename:'||E.ename);              where current of c;
  9  end;            end if;
 10  /         end loop;
   end;
Aim: To Write a pl/sql program to calculate the student /
grade using case statement.
Aim: To Write a pl/sql program to delete employees whose
 declare experience  is less then 2   years.
          Grd student.grade%type;
     begin Source code:
        select grade into Grd from student declare
        where sno=100;     cursor c is select *From emp for update;
     emp_rec emp%rowtype; rows_affected := to_char(sql%rowcount);
begin if sql%rowcount > 0 then
  for emp_rec in c dbms_output.put_line(rows_affected || 'employee records
  loop modified successfully');
     if emp_rec.experience<2 then else
       delete emp dbms_output.put_line('There are no employees working as
       where current of c; programmers');
      end if; end if;
   end loop; end;
end;
/
DECLARE
Aim: To write a pl/sql program to displaying employee total_rows number(2);
details using cursors. BEGIN
Source code: UPDATE customers
SET salary = salary + 500;
   declare IF sql%notfound THEN
      no emp.eno%type; dbms_output.put_line('no customers selected');
      name emp.ename%type; ELSIF sql%found THEN
      cursor emp_cur is select eno,ename from emp; total_rows := sql%rowcount;
    begin dbms_output.put_line( total_rows || ' customers selected
       open emp_cur;           ');
       loop END IF;
         fetch emp_cur into no,name; END;
         exit when emp_cur%notfound;      /
         DBMS_output.put_line('Employee No:'||no||'Employee
Name:'||name);
       end loop;
      close emp_cur; BEGIN
    end; UPDATE emp_information SET
    / emp_dept='Web Developer'
WHERE emp_name='Saulin';
begin IF SQL%FOUND THEN
update employee set salary=salary *0.15 dbms_output.put_line('Updated - If
where emp_code = &emp_code; Found');
if sql%found then END IF;
dbms_output.put_line('employee record modified IF SQL%NOTFOUND THEN
successfully'); dbms_output.put_line('NOT Updated
else - If NOT Found');
dbms_output.put_line('employee no does not exist'); END IF;
end if; IF SQL%ROWCOUNT>0 THEN
end; dbms_output.put_line(SQL
%ROWCOUNT||' Rows Updated');
--EXAMPLE FOR SQL%NOTFOUND (IMPLICIT ELSE
CURSORS) dbms_output.put_line('NO Rows
begin Updated Found');
update employee set salary = salary*0.15 where emp_code END;
= &emp_code; /
if sql%notfound then
dbms_output.put_line('employee no . does not exist'); --EXPLICIT CURSOR EG
else
dbms_output.put_line('employee record modified DECLARE
successfully'); CURSOR c1 is SELECT * FROM emp;
end if; str_empno emp.empno%type;
end; str_ename emp.ename%type;
str_job emp.job%type;
--EXAMPLE FOR SQL%ROWCOUNT (IMPLICIT str_mgr emp.mgr%type;
CURSORS) str_hiredate emp.hiredate%type;
str_sal emp.sal%type;
declare str_comm emp.comm%type;
rows_affected char(4); str_deptno emp.deptno%type;
begin rno number;
update employee set salary = salary*0.15 where BEGIN
job='programmers'; rno := &rno;
FOR e_rec IN c1 BEGIN
LOOP dn := &deptno;
IF c1%rowcount = rno THEN OPEN ecur FOR SELECT * FROM emp WHERE
DBMS_OUTPUT.PUT_LINE (str_empno || ' ' deptno = dn;
|| str_ename || ' ' || str_job || ' ' || str_mgr || ' ' FOR e_rec IN ecur
|| str_hiredate || ' ' || str_sal || ' ' || str_comm || ' ' || LOOP
str_deptno); DBMS_OUTPUT.PUT_LINE ('Employee No : ' ||
END IF; e_rec.empno);
END LOOP; DBMS_OUTPUT.PUT_LINE ('Employee Salary: ' ||
END; e_rec.salary);
END LOOP;
--ANOTHER EG DISPLAYING VALUE OF A TABLE END;
DECLARE
CURSOR c1 IS SELECT * FROM emp; --REF WEAK CURSORS
e_rec emp%rowtype; DECLARE
BEGIN TYPE tcursor IS REF CURSOR;
OPEN c1; tcur tcursor;
LOOP e1 emp%ROWTYPE;
FETCH c1 INTO e_rec; d1 dept%ROWTYPE;
DBMS_OUTPUT.PUT_LINE('Number: ' || ' ' || tname VARCHAR2(20);
e_rec.empno); BEGIN
DBMS_OUTPUT.PUT_LINE('Name : ' || ' ' || e_rec.ename); tname := &tablename;
DBMS_OUTPUT.PUT_LINE('Salary: ' || ' ' || e_rec.sal); IF tname = 'emp' THEN
EXIT WHEN c1%NOTFOUND; OPEN tcur FOR SELECT * FORM emp;
END LOOP; DBMS_OUTPUT.PUT_LINE ('Emp table opened.');
CLOSE c1; close tcur;
END; DBMS_OUTPUT.PUT_LINE ('Emp table closed.');
ELSE IF tname = 'dept' THEN
-- Display details of Highest 10 salary paid employee OPEN tcur FOR SELECT * FROM dept;
DECLARE DBMS_OUTPUT.PUT_LINE ('Dept table opened.');
CURSOR c1 IS SELECT * FROM emp ORDER BY sal close tcur;
DESC; DBMS_OUTPUT.PUT_LINE ('Emp table closed.');
e_rec emp%rowtype; ELSE
BEGIN RAISE_APPLICATION_ERROR (-20004, 'Table name is
FOR e_rec IN c1 wrong');
LOOP END IF;
DBMS_OUTPUT.PUT_LINE('Number: ' || ' ' || END;
e_rec.empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || ' ' || e_rec.ename); --CURSOR FOR LOOP WITH PARAMETERS
DBMS_OUTPUT.PUT_LINE('Salary: ' || ' ' || e_rec.sal); Declare
EXIT WHEN c1%ROWCOUNT >= 10; Cursor c1(Dno number) is select * from emp where deptno
END LOOP; = dno;
END; begin
for empree in c1(10) loop;
-- EXAMPLE OF CURSOR FOR LOOP dbms_output.put_line(empree.ename);
declare cursor c1 is select * from somdutt; end loop;
begin end;
for outvariable in c1 DECLARE
loop c_id customers.id%type;
exit when c1%notfound; c_name customerS.No.ame%type;
if outvariable.age < 21 then c_addr customers.address%type;
dbms_output.put_line(outvariable.age || ' ' || CURSOR c_customers is
outvariable.name); SELECT id, name, address FROM customers;
end if; BEGIN
end loop; OPEN c_customers;
end; LOOP
FETCH c_customers into c_id, c_name, c_addr;
--ref STRONG CURSORS EXIT WHEN c_customers%notfound;
DECLARE dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
TYPE ecursor IS REF CURSOR RETURN emp END LOOP;
%ROWTYPE; CLOSE c_customers;
ecur ecursor; END;
e_rec emp%ROWTYPE;
dn NUMBER;
/ 4> emp_rec emp_cur%rowtype;
5> BEGIN
6> FOR emp_rec in sales_cur
1> DECLARE 7> LOOP
2> emp_rec emp_tbl%rowtype; 8> dbms_output.put_line(emp_cur.first_name || ' ' ||
3> CURSOR emp_cur IS emp_cur.last_name
4> SELECT * 9> || ' ' ||emp_cur.salary);
5> FROM 10> END LOOP;
6> WHERE salary > 10; 11>END;
7> BEGIN 12> /
8>  OPEN emp_cur;
9>  FETCH emp_cur INTO emp_rec; display all information about employees
10>     dbms_output.put_line (emp_rec.first_name || '  ' || create or replace PROCEDURE
emp_rec.last_name); get_employee_info_by_employee_id
11>  CLOSE emp_cur; (
12> END; p_employee_id NUMBER DEFAULT -1
)
Cursor with a Simple Loop: AS
1> DECLARE v_count NUMBER;
2> CURSOR emp_cur IS BEGIN
3> SELECT first_name, last_name, salary FROM SELECT COUNT(*)
emp_tbl; INTO v_count
4> emp_rec emp_cur%rowtype; FROM employee
5> BEGIN WHERE employee_id = p_employee_id;
6> IF NOT sales_cur%ISOPEN THEN
7> OPEN sales_cur; IF p_employee_id IS NULL THEN
8> END IF; DBMS_OUTPUT.PUT_LINE('Employee ID: ' ||
9> LOOP employee_id);
10> FETCH emp_cur INTO emp_rec; DBMS_OUTPUT.PUT_LINE('NAME: ' || name);
11> EXIT WHEN emp_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE('EMAIL_ADDRESS: ' ||
12> dbms_output.put_line(emp_cur.first_name || ' ' || email_address);
emp_cur.last_name DBMS_OUTPUT.PUT_LINE('HIRE_DATE: ' ||
13> || ' ' ||emp_cur.salary); hire_date);
14> END LOOP; DBMS_OUTPUT.PUT_LINE('UPDATE_DATE: ' ||
15> END; update_date);
16> /
ELSE
SELECT COUNT(*)
Cursor with a While Loop:
INTO v_count
Lets modify the above program to use while loop.
FROM employee
1> DECLARE
WHERE employee_id = p_employee_id;
2> CURSOR emp_cur IS
END IF;
3> SELECT first_name, last_name, salary FROM emp_tbl;
END;
4> emp_rec emp_cur%rowtype;
5> BEGIN
6> IF NOT sales_cur%ISOPEN THEN Aim: To Write a pl/sql program to handle a predefined
7> OPEN sales_cur; exception.
8> END IF; Source code:
9> FETCH sales_cur INTO sales_rec;
10> WHILE sales_cur%FOUND THEN   declare
11> LOOP       n number(4);
12> dbms_output.put_line(emp_cur.first_name || ' ' ||       d number(4);
emp_cur.last_name   begin
13> || ' ' ||emp_cur.salary);       n:=&n;
15> FETCH sales_cur INTO sales_rec;       d:=n/0;
16> END LOOP;        EXCEPTION
17> END;          WHEN ZERO_DIVIDE THEN
18> /            DBMS_OUTPUT.PUT_LINE('Divide by error
exception is caught');
Let’s use the above example to learn how to use for loops in   end;
cursors.  /
1> DECLARE
2> CURSOR emp_cur IS
3> SELECT first_name, last_name, salary FROM emp_tbl;
Aim: To Write a pl/sql program to handle a user defined BEFORE DELETE OR INSERT OR UPDATE ON
exception. customers
Source code:
FOR EACH ROW
declare WHEN (NEW.ID > 0)
       others Exception; DECLARE
       n dept.dno%type; sal_diff number;
       name dept.dname%type; BEGIN
       n1 dept.dno%type; sal_diff := :NEW.salary - :OLD.salary;
 begin dbms_output.put_line('Old salary: ' || :OLD.salary);
       n1:=&dept_no; dbms_output.put_line('New salary: ' || :NEW.salary);
       select dno,dname into n,name dbms_output.put_line('Salary difference: ' || sal_diff);
       from dept END;
        where dno=n1; /
      if n<>n1 then
         raise others;
Create the price_history_trigger and execute it.
     else
        update dept set dname='&dname'
CREATE or REPLACE TRIGGER price_history_trigger
         where dno=n;
BEFORE UPDATE OF unit_price
         Dbms_output.put_line('dname updated.');
ON product
       end if;
FOR EACH ROW
    Exception
BEGIN
       when others then
INSERT INTO product_price_history
            Dbms_output.put_line('given dno is not
VALUES
found');
(:old.product_id,
     end;
:old.product_name,
    /
:old.supplier_name,
:old.unit_price);
Aim: To Write a pl/sql program for creating a procedure for END;
calculating /
          sum of two numbers. Lets update the price of a product.
Source code: UPDATE PRODUCT SET unit_price = 800 WHERE
create or replace procedure "SUM"(n1 IN product_id = 100
NUMBER,n2 IN NUMBER) is Once the above update query is executed, the trigger fires
total number(6); and updates the 'product_price_history' table.
begin This trigger execute BEFORE to convert ename field
total:=n1+n2; lowercase to uppercase.
  dbms_output.put_line('the sum is:'||total); CREATE or REPLACE TRIGGER trg1
end; BEFORE
INSERT ON emp1
Execution: FOR EACH ROW
     Method1: BEGIN
         SQL> exec sum(10,20); :new.ename := upper(:new.ename);
         the sum is:30
         END;
           PL/SQL procedure successfully completed.
/
   
      Method 2:
          SQL> begin This trigger is preventing to deleting row.
  2  sum(12,13);
  3  end; CREATE or REPLACE TRIGGER trg1
  4  / AFTER
the sum is:25 DELETE ON emp1
FOR EACH ROW
BEGIN
This trigger will display the salary difference between IF :old.eno = 1 THEN
the old values and new values raise_application_error(-20015, 'You
can't delete this row');
CREATE OR REPLACE TRIGGER END IF;
display_salary_changes END;
/
Example 9-1 Trigger Uses Conditional Predicates to IF x > y THEN
Detect Triggering Statement z:= x;
ELSE
CREATE OR REPLACE TRIGGER t Z:= y;
BEFORE END IF;
INSERT OR RETURN z;
UPDATE OF salary, department_id OR END;
DELETE BEGIN
ON employees a:= 23;
BEGIN b:= 45;
CASE c := findMax(a, b);
WHEN INSERTING THEN dbms_output.put_line(' Maximum of (23,45): ' || c);
DBMS_OUTPUT.PUT_LINE('Inserting'); END;
WHEN UPDATING('salary') THEN /
DBMS_OUTPUT.PUT_LINE('Updating salary');
WHEN UPDATING('department_id') THEN
DBMS_OUTPUT.PUT_LINE('Updating department
ID'); the following program calculates the factorial of a given
WHEN DELETING THEN number by calling itself recursively −
DBMS_OUTPUT.PUT_LINE('Deleting');
END CASE; DECLARE
END; num number;
/ factorial number;

FUNCTION fact(x number)


RETURN number
to create and call a standalone function IS
f number;
CREATE OR REPLACE FUNCTION totalCustomers BEGIN
RETURN number IS IF x=0 THEN
total number(2) := 0; f := 1;
BEGIN ELSE
SELECT count(*) into total f := x * fact(x-1);
FROM customers; END IF;
RETURN f;
RETURN total; END;
END;
/ BEGIN
num:= 6;
Calling function factorial := fact(num);
DECLARE dbms_output.put_line(' Factorial '|| num || ' is ' || factorial);
c number(2); END;
BEGIN /
c := totalCustomers(); This program finds the minimum of two values
dbms_output.put_line('Total no. of Customers: ' || c);
END;
DECLARE
/
a number;
b number;
c number;
example demonstrates Declaring, Defining, and PROCEDURE findMin(x IN number, y IN number, z OUT
Invoking a Simple PL/SQL Function that computes and number) IS
returns the maximum of two values. BEGIN
IF x < y THEN
DECLARE z:= x;
a number; ELSE
b number; z:= y;
c number; END IF;
FUNCTION findMax(x IN number, y IN number) END;
RETURN number BEGIN
IS a:= 23;
z number; b:= 45;
BEGIN findMin(a, b, c);
dbms_output.put_line(' Minimum of (23, 45) : ' || c);
END;
/
computes the square of value of a passed value
DECLARE
a number;
PROCEDURE squareNum(x IN OUT number) IS
BEGIN
x := x * x;
END;
BEGIN
a:= 23;
squareNum(a);
dbms_output.put_line(' Square of (23): ' || a);
END;
/

The below example creates a procedure


‘employer_details’ which gives the details of the
employee.
1> CREATE OR REPLACE PROCEDURE
employer_details
2> IS
3> CURSOR emp_cur IS
4> SELECT first_name, last_name, salary FROM emp_tbl;
5> emp_rec emp_cur%rowtype;
6> BEGIN
7> FOR emp_rec in sales_cur
8> LOOP
9> dbms_output.put_line(emp_cur.first_name || ' ' ||
emp_cur.last_name
10> || ' ' ||emp_cur.salary);
11> END LOOP;
12>END;
13> /

How to execute a Stored Procedure?

There are two ways to execute a procedure.

1) From the SQL prompt.


EXECUTE [or EXEC] procedure_name;
2) Within another procedure – simply use the procedure
name.

procedure_name;

You might also like