PL/SQL 5.
EJERCICIOS PROCEDIMINETOS Y FUNCIONES
1º.- Crear un procedimiento que se denomine ordenación_tres al que se le pasen
tres números como parámetros y nos salgan ordenados de mayor a menor
create or replace procedure ordenacion_tres (num1 real, num2 real, num3 real) is
BEGIN
if (num1 = num2 and num2 = num3) then
dbms_output.put_line('Todos son iguales, orden '||num1||', '||num2||', '||
num3);
elsif (num1 >= num2 and num1 >= num3) then
if (num2 > num3) then
dbms_output.put_line(num1||', '||num2||', '||num3);
elsif (num3 >= num2) then
dbms_output.put_line(num1||', '||num3||', '||num2);
end if;
elsif (num2 >= num1 and num2 >= num3) then
if (num1 >= num3) then
dbms_output.put_line(num2||', '||num1||', '||num3);
elsif (num3 >= num1) then
dbms_output.put_line(num2||', '||num3||', '||num1);
end if;
elsif (num3 >= num1 and num3 >= num2) then
if (num1 >= num2) then
dbms_output.put_line(num3||', '||num1||', '||num2);
elsif (num2 >= num1) then
dbms_output.put_line(num3||', '||num2||', '||num1);
end if;
end if;
END;
/
Execute ordenacion_tres (1,2,3);
Página 1 de 7
PL/SQL 5. EJERCICIOS PROCEDIMINETOS Y FUNCIONES
2º.- Crear un procedimiento Pcalcularsueldosdep al que se le pasa un numero de
departamento y muestra cuantos empleados hay en el departamento, el total de sueldos y
el total de comisiones del departamento
create or replace procedure pcalcularsueldosdep
(ndep employee.department_id%type) as
numemp number;
sums number;
sumc number;
begin
select count(*) , sum(salary) , nvl(sum(commission),0) into numemp, sums,sumc
from employee
where department_id=ndep;
dbms_output.put_line ('numero de empleados: '||numemp||' del departamento '||ndep||' total de
sueldos '||sums||' total comisiones '||sumc);
end;
/
execute Pcalcularsueldosdep (20);
3º.- Desarrolla un procedimiento denominado pverApellidos que visualice el
apellido y la fecha de alta de todos los empleados ordenados por apellido
create or replace procedure pverapellidos
as
vapel employee.last_name%type;
vfecha employee.hire_date%type;
cursor capellido is
select last_name, hire_date
from employee order by last_name;
begin
open capellido;
fetch capellido into vapel,vfecha;
while capellido%found loop
dbms_output.put_line (vapel||' '||vfecha);
fetch capellido into vapel,vfecha;
end loop;
dbms_output.put_line ('se han procesado '||capellido%rowcount||' registros');
close capellido;
end;
/
execute pverApellidos();
Página 2 de 7
PL/SQL 5. EJERCICIOS PROCEDIMINETOS Y FUNCIONES
4º.- Crear un procedimiento pverempleoficio al que le paso un oficio y muestra el
nombre, apellidos, oficio, código de departamento y nombre del departamento de los
empleados que tienen ese oficio
create or replace procedure pverempleoficio
(poficio employee.job_id%type) as
vnombre employee.first_name%type;
vapel employee.last_name%type;
voficio employee.job_id%type;
coddep department.department_id%type;
vnombredep [Link]%type;
cursor c is
select first_name,last_name,job_id, department.department_id, name into
vnombre, vapel, voficio, coddep, vnombredep
from employee, department
where employee.department_id=department.department_id and
employee.job_id=poficio;
begin
open c;
fetch c into vnombre, vapel, voficio, coddep, vnombredep;
while c%found loop
dbms_output.put_line (vnombre||' '||vapel||' '||voficio||' '||coddep||' '||
vnombredep);
fetch c into vnombre, vapel, voficio, coddep, vnombredep;
end loop;
close c;
end;
/
execute pverempleoficio(669);
Página 3 de 7
PL/SQL 5. EJERCICIOS PROCEDIMINETOS Y FUNCIONES
5º.- Crear un procedimiento denominado ver_productos al que se le pase como
parámetro el nombre de un cliente y muestre todos los productos dicho cliente.
create or replace procedure ver_productos
(nombre [Link]%type) is
cursor c is
select distinct description
from product ,sales_order ,item ,customer
where product.product_id=item.product_id and item.order_id=sales_order.order_id
and sales_order.customer_id=customer.customer_id and [Link]=nombre;
nombre1 [Link]%type;
begin
open c;
dbms_output.put_line('El cliente'||nombre||'ha comprado');
fetch c into nombre1;
while c%found loop
dbms_output.put_line(nombre1);
fetch c into nombre1;
end loop;
close c;
end;
/
execute ver_productos('VOLLYRITE');
6º.- Crear un procedimiento denominado clientes_productos que muestre todos
los productos de todos los clientes. Para ello utiliza el procedimiento ver_productos del
ejercicio anterior.
create or replace procedure clientes_productos is
cursor c1 is select name from customer;
nombre [Link]%type;
begin
open c1;
fetch c1 into nombre;
while c1%found loop
ver_productos(nombre);
dbms_output.put_line(' ');
fetch c1 into nombre;
end loop;
close c1;
end;
/
execute clientes_productos;
Página 4 de 7
PL/SQL 5. EJERCICIOS PROCEDIMINETOS Y FUNCIONES
7º.- Crear una funcion denominada cuentablancos a la que se le pasa una cadena
de caracteres y nos devuelve el número de espacios que tiene dicha cadena de caracteres
create or replace function cuentablancos(cadena varchar2)
return number is
contador number(2):=0;
begin
for i in 1..length(cadena) loop
if substr(cadena,i,1)=' ' then
contador:=contador + 1;
end if;
end loop;
return contador;
end;
/
var cadena varchar2(3000);
declare
caracteres number(2);
begin
:cadena:='&cadena';
caracteres:=cuentablancos(:cadena);
dbms_output.put_line(to_char(caracteres));
end;
/
8º.- crear una funcion denominada suma_salarial en la que se le pasa el nombre de un
departamento y nos devuelve la suma de salarios de los empleados de dicho departamento.
create or replace function suma_salarial(nombre varchar2)
return number is
suma [Link]%type;
begin
select sum(salary) into suma
from employee,department
where employee.department_id=department.department_id
and name=nombre;
return suma;
end;
/
select name,suma_salarial(name)
from department;
Página 5 de 7
PL/SQL 5. EJERCICIOS PROCEDIMINETOS Y FUNCIONES
9º.- Escribir una funcion denominada trienios que haciendo uso de la función
func_fecha del ejemplo resuelto en el tema devuelva los trienios que hay entre dos
fechas. (Un trienio son tres años completos).
create or replace function trienios (fecha1 date, fecha2 date) return integer as
tri integer;
begin
tri := trunc(func_fecha(fecha1, fecha2)/3);
return tri;
end trienios;
/
declare
trienios1 number;
begin
trienios1:=trienios ('03/12/2005', '08/08/1999');
dbms_output.put_line(trienios1);
end;
/
10º.- Crear una función que permita visualizar la ciudad que más órdenes de venta
ha realizado.
create or replace function get_city_sales return varchar2
is
cursor c_city is
select [Link] city, count(*) cant
from sales_order so, customer c
where so.customer_id = c.customer_id
group by [Link]
order by cant desc;
city varchar2(14);
cant number(6);
begin
open c_city;
fetch c_city into city, cant;
if c_city%found then
return city;
else
return 'no hay ventas';
end if;
close c_city;
end;
/
begin
dbms_output.put_line(get_city_sales);
end;
/
Página 6 de 7
PL/SQL 5. EJERCICIOS PROCEDIMINETOS Y FUNCIONES
11º.- Crear una función en la que dado un departamento devuelva el empleado
(apellido) de dicho departamento que cuenta con mayor salario
create or replace function get_max_sal_emp (dep varchar2) return varchar2
is
emp varchar2(14);
sal number(6);
cursor c_emp is
select e.last_name emp, [Link] sal
from employee e, department d
where d.department_id = e.department_id and [Link]= dep
order by sal desc;
begin
open c_emp;
fetch c_emp into emp, sal;
if c_emp%found then
return emp;
else
return 'no hay empleado';
end if;
close c_emp;
end;
/
declare
emp varchar2(15);
begin
emp := get_max_sal_emp('research');
dbms_output.put_line(emp);
end;
/
Página 7 de 7