PL/SQL Code Examples: Procedures, Functions, and Cursors

PL/SQL Code Examples

Always do:

set serveroutput on;


Program that adds two numbers


declare
 a number;
 b number;
 suma number;
begin
a:=5;
b:=4;
suma:=a+b;
dbms_output.put_line(suma);
end;


 set serveroutput on



Input of variables from the keyboard:


 declare
  a number;
  b number;
  nom varchar2(40);
  suma number;
 begin
 nom:='&nombre';
 a:=&numero1;
 b:=&numero2;
 suma:=a+b;
 dbms_output.put_line(nom);
 dbms_output.put_line('The sum is: '||suma);
 end;



Compare two numbers


declare
 a number;
 b number;
begin
a:=5;
b:=14;
if (a>b) then
 dbms_output.put_line(a ||' is greater than ' ||b);
else
 dbms_output.put_line(b ||' is greater than ' ||a);
end if;
end;





Output from 1 to 10 vertically:
declare
 i number;
begin
 i:=1;
 while (i<=10) loop
   dbms_output.put_line(i);
   i:=i+1;
 end loop;
end;


Output from 1 to 10 horizontally:


declare
 i number;
 cadena varchar2(30);
begin
 i:=1;
 cadena:='';
 while (i<=10) loop
   cadena:=cadena||' '||i;
   i:=i+1;
 end loop;
dbms_output.put_line(cadena);
end;


With a for loop:


declare
 cadena varchar2(30);
begin
 cadena:='';
 for i in 1..10 loop
   cadena:=cadena||' '||i;
 end loop;
dbms_output.put_line(cadena);
end;


With a loop:


declare
 i number;
 cadena varchar2(30);
begin
 i:=1;
 cadena:='';
 loop
   exit when (i>10);
   cadena:=cadena||' '||i;
   i:=i+1;
 end loop;
dbms_output.put_line(cadena);
end;



Function call (long):


declare
 euros number;
begin
  euros:=Euros_X(1000);
  dbms_output.put_line(euros);
end;


Function call (short)



begin
  dbms_output.put_line(Euros_X(1000));
end;


It can be put as a column of a select


Call a procedure:


1.
 execute Tres_fechas('7/1/14');


2.
begin
 Tres_fechas('7/1/14');
end;


Show from 1 to 10 and their squares:
begin
for i in 1..10 loop
  dbms_output.put_line(i||'-'||i*i); 
end loop;
end;


From 1 to 50 the odd numbers:
declare
 i number;
begin
 i:=1;
 while (i<=50) loop
   dbms_output.put_line(i);
   i:=i+2;
 end loop;
end;



Multiplication table of 7


 CREATE OR REPLACE PROCEDURE Mult_tabla_x
 IS
 BEGIN
  FOR i IN 1..10 LOOP
   dbms_output.put_line('7*'||i||'='||7*i);
  END LOOP;
 END;
 /


execute Mult_tabla_x;


CREATE OR REPLACE PROCEDURE Mult_tabla_x (num number)
IS
BEGIN
 FOR i IN 1..10 LOOP
  dbms_output.put_line(num||'*'||i||'='||num*i);
 END LOOP;
END;


FINAL EXERCISES:
1.
CREATE OR REPLACE PROCEDURE suma (num1 number,num2 number)
IS
s number;
BEGIN
s:=num1+num2; 
dbms_output.put_line(s);
END;
2.
CREATE OR REPLACE PROCEDURE Gira_cadena (cad varchar2)
IS
letra VARCHAR2(1);
paraula VARCHAR2(30):='';
BEGIN
 FOR i IN REVERSE 1..length(cad) LOOP
  letra:=substr(cad,i,1);
  paraula:=paraula||letra;
 END LOOP;
dbms_output.put_line(paraula);
END;


3.
CREATE OR REPLACE FUNCTION fsuma (num1 number,num2 number)
return number
IS
s number;
BEGIN
s:=num1+num2; 
return s;
END;


Function call:
begin
  dbms_output.put_line(fsuma(10,5));
end;



CREATE OR REPLACE FUNCTION fGira_cadena (cad varchar2)
return VARCHAR2
IS
letra VARCHAR2(1);
paraula VARCHAR2(30):='';
BEGIN
 FOR i IN REVERSE 1..length(cad) LOOP
  letra:=substr(cad,i,1);
  paraula:=paraula||letra;
 END LOOP;
return paraula;
END;



4


CREATE OR REPLACE FUNCTION anyo(v_fecha DATE)
return NUMBER
IS
 v_anyo NUMBER;
BEGIN
 v_anyo:=to_number(to_char(v_fecha,'YYYY'));
return v_anyo;
END;




5. call:


begin
  dbms_output.put_line(anyos_completos('21/01/14','01/01/12'));
end;



6.


CREATE OR REPLACE FUNCTION anyos_completos
  (v_fecha1 DATE,v_fecha2 DATE)
return NUMBER
IS
 v_anyo NUMBER;
BEGIN
 v_anyo:=trunc(months_between(v_fecha1,v_fecha2)/12);
return v_anyo;
END;



7.
CREATE OR REPLACE FUNCTION trienios
  (v_fecha1 DATE,v_fecha2 DATE)
return NUMBER
IS
 v_anyo NUMBER;
 v_trienios NUMBER;
BEGIN
  v_trienios:=trunc(anyos_completos(v_fecha1,v_fecha2)/3);
  return v_trienios;
END;


8.
CREATE OR REPLACE PROCEDURE suma5
  (num1 number,num2 number,num3 number default 0,
  num4 number default 0,num5 number default 0)
IS
s number;
BEGIN
s:=num1+num2+num3+num4+num5; 
dbms_output.put_line(s);
END;


9.
CREATE OR REPLACE FUNCTION convierte (cad varchar2)
return VARCHAR2
IS
letra VARCHAR2(1);
desti VARCHAR2(30):='';
BEGIN
 FOR i IN 1..length(cad) LOOP
  letra:=substr(cad,i,1);
  if (letra>='a' and letra<='z') or 
      (letra>='A' and letra<='Z') then
  desti:=desti||letra;
   else
  desti:=desti||' ';
  end if;
 END LOOP;
return desti;
END;


Another if:
if (letra between 'a' and 'z' or letra between 'A' and 'Z')


begin
  dbms_output.put_line(convierte('Ho+++la mund99o qu444e t||@al '));
end;


10.
CREATE OR REPLACE PROCEDURE delemple (num number)
IS
n number;
BEGIN
select count(*) into n from emple where emp_no=num;
if (n=1) then
delete emple where emp_no=num;
dbms_output.put_line('Employee '||num||' deleted');
else
 dbms_output.put_line('Employee '||num||' does not exist');
end if;
END;
/



11.
CREATE OR REPLACE PROCEDURE modloc (num number,vloc varchar2)
IS


n number;
BEGIN


select count(*) into n 
from depart where dept_no=num;


if (n=1) then


 UPDATE DEPART
 SET LOC=vloc
 where dept_no=num;


else
 dbms_output.put_line('the department '||num||' does not exist'); 
end if;
END;



5. next page:



CREATE OR REPLACE PROCEDURE inserta(nom varchar2,lloc varchar2)
IS
 num number;
 cont number;
BEGIN


select count(*)
into cont
from depart
where dnombre=nom and loc=lloc;


if cont=1 then
  dbms_output.put_line('The department '||nom||' already exists in '||lloc);


else
select max(DEPT_NO)+10
into num
from depart;


if num is null then
 num:=10;
end if;


insert into depart values (num,nom,lloc);



end if;
END;




CURSOR WITH FOR — WHEN THE ENTIRE CURSOR IS TRAVERSED:


CREATE OR REPLACE PROCEDURE recorredepart
IS
cursor c is
select dnombre,loc
from depart;
begin
 for v in c loop
   dbms_output.put_line(v.dnombre||' '||v.loc);
 end loop;
end;


CURSOR WITH LOOP


CREATE OR REPLACE PROCEDURE recorredepart
IS
cursor c is
select dnombre,loc
from depart;
v c%ROWTYPE; 
begin
open c;
loop
   fetch c into v;
   exit when c%NOTFOUND;
   dbms_output.put_line(v.dnombre||' '||v.loc);
end loop; 
close c;
end;


CURSOR WITH WHILE;


CREATE OR REPLACE PROCEDURE recorredepart
IS
cursor c is
select dnombre,loc
from depart;
v c%ROWTYPE; 
begin
open c;
fetch c into v;
while c%FOUND loop
   dbms_output.put_line(c%rowcount||v.dnombre||' '||v.loc);
   fetch c into v;
end loop; 
close c;
end;



1.


CREATE OR REPLACE PROCEDURE empleordenats
IS
cursor c is
select apellido,fecha_alt
from emple
order by apellido;
begin
 for v in c loop
   dbms_output.put_line(v.fecha_alt||' '||v.apellido);
 end loop;
end;



2.
// This could be done in a FOR loop
select dnombre,count(*)
from emple,depart
where emple.dept_no=depart.dept_no
group by dnombre




2.
CREATE OR REPLACE PROCEDURE empleperdepart
IS
cursor c is
select * 
from depart;
num number; 
begin
 for v in c loop
   select count(*)
   into num
   from emple
   where dept_no=v.dept_no;
   dbms_output.put_line(v.dnombre ||v.loc|| ' '|| num);
 end loop;
end;



3.
CREATE OR REPLACE PROCEDURE cincosalarios
IS
cursor c is
 select apellido,salario
 from emple
 order by salario desc;
v c%ROWTYPE; 
fila number;
begin


fila:=1;
open c;
fetch c into v;
while fila<6 and c%found loop
   dbms_output.put_line(v.apellido||' '||v.salario);
   fetch c into v;
   fila:=fila+1;
end loop; 
close c;
end;



4.
CREATE OR REPLACE PROCEDURE dosmenoscobran
IS
cursor c is
select emp_no, salario, oficio
from emple
order by oficio,salario;
ofiant varchar2(20):=' ';
contant number:=0;
begin
 for v in c loopcount


   if v.oficio!=ofiant then
     contant:=0;
     dbms_output.put_line('--------------- ');
     dbms_output.put_line(v.oficio);
     dbms_output.put_line('---------------');
     dbms_output.put_line(v.apellido ||' '||v.salario);
   elsif contant<2 then
     dbms_output.put_line(v.apellido ||' '||v.salario);
   end if;
   ofiant:=v.oficio;
   contant:=contant+1;
 end loop;
end;



8.
create or replace procedure subir_salario
(num number, importe number,porcen number) is
cursor c is select emp_no,salario
        from emple
   where dept_no=num;
sumsalari number;
contsalari number;
begin


for v in c loop
  sumsalari:=v.salario+importe;
  contsalari:=v.salario+v.salario*porcen/100;
  if (sumsalari>contsalari) then
    update emple
    set salario=sumsalari
    where emp_no=v.emp_no;
  else
    update emple
    set salario=contsalari
    where emp_no=v.emp_no;
  end if;
end loop;
end;



execute subir_salario(20,100,20);



9.


declare
cursor c is
select apellido,salario,oficio,dnombre,fecha_alt,
      comision,emp_no
from depart,emple
where depart.dept_no=emple.dept_no
order by apellido;
trienios number;
subordinados number;
total number;


begin


for v in c loop
dbms_output.put_line('**************************************');
dbms_output.put_line('Employee liquidation:'||v.apellido);
dbms_output.put_line('Dept:                  '||v.dnombre);
dbms_output.put_line('Job:                  '||v.oficio);
dbms_output.put_line('Salary:               '||v.salario);


trienios:=trunc(((sysdate-v.fecha_alt)/365)/3);


dbms_output.put_line('Seniority bonus:              '||trienios*50);


select count(*)
into subordinados
from emple
where dir=v.emp_no;


dbms_output.put_line('Responsibility bonus:    '||subordinados*100);


if v.comision is null then
  v.comision:=0;
end if;


dbms_output.put_line('Commission:              '||v.comision);