Ejercicio
1
Haz una función llamada DevolverCodDept que reciba el
nombre de un departamento y devuelva su código.
create or replace function
DevolverCodDept (p_nombre dept.dname%type)
return dept.deptno%type
is
       v_codigo     dept.deptno%type;
begin
       select
deptno into v_codigo
       from
dept
       where
dname=p_nombre;
       return
v_codigo;
exception
       when
NO_DATA_FOUND then
             dbms_output.put_line('Departamento
'||p_nombre||' no existe');
             return
-1;
       when
TOO_MANY_ROWS then
              dbms_output.put_line('Departamento
'||p_nombre||' repetido');
             return
-2;
end
DevolverCodDept;
Ejercicio
2
Realiza un procedimiento llamado HallarNumEmp que
recibiendo un nombre de departamento, muestre en pantalla el número de
empleados de dicho departamento. Puedes utilizar la función creada en el
ejercicio 1.
Si el departamento no tiene empleados deberá mostrar un
mensaje informando de ello. Si el departamento no existe se tratará la
excepción correspondiente.
create or replace procedure HallarNumEmp
(p_nombre dept.dname%type)
is
       v_codigo            dept.deptno%type;
       v_numempleados      number(4);
begin
       v_codigo:=DevolverCodDept(p_nombre);
       if v_codigo>=0 then
             select
count(*) into v_numempleados
             from
emp
             where
deptno=v_codigo;
             dbms_output.put_line('El
departamento '||p_nombre||' tiene '||                                             v_numempleados||'
empleados');
       end if;
end HallarNumEmp;
Ejercicio 3
Realiza una función llamada CalcularCosteSalarial que
reciba un nombre de departamento y devuelva la suma de los salarios y
comisiones de los empleados de dicho departamento. Trata las excepciones que
consideres necesarias.
create
or replace function CalcularCosteSalarial (p_nombre dept.dname%type)
return NUMBER
is
       v_codigo
           dept.deptno%type;
       v_costetotal        number(8);
begin
       v_codigo:=DevolverCodDept(p_nombre);
       if v_codigo>=0 then
             select
sum(sal+nvl(comm,0)) into v_costetotal
             from
emp
             where
deptno=v_codigo;
             return
v_costetotal;
       else
             return v_codigo; -- devuelvo el
error de DevolverCodDept
       end if;
end
CalcularCosteSalarial;
Ejercicio 4
Realiza un procedimiento MostrarCostesSalariales que
muestre los nombres de todos los departamentos y el coste salarial de cada uno
de ellos. Puedes usar la función del ejercicio 3.
create
or replace procedure MostrarCostesSalariales
is
       cursor
c_dept
       is
       select
dname
       from
dept;
       v_coste
number(9);
begin
       for
v_nombres in c_dept loop
             v_coste:=CalcularCosteSalarial(v_nombres.dname);
             if v_coste>=0 then
                    dbms_output.put_line(v_nombres.dname||'  '||v_coste);
             end
if;
       end
loop;
end MostrarCostesSalariales;
Ejercicio
5
Realiza un procedimiento MostrarAbreviaturas que muestre
las tres primeras letras del nombre de cada empleado.
create or replace procedure MostrarAbreviaturas
is
       cursor
c_emp is
       select
substr(ename, 1, 3) as abreviatura
       from
emp;
begin
       for
v_emp in c_emp loop
             dbms_output.put_line(v_emp.abreviatura);       
       end
loop;    
end
MostrarAbreviaturas;
Ejercicio
6
Realiza un procedimiento MostrarMasAntiguos que muestre
el nombre del empleado más antiguo de cada departamento junto con el nombre del
departamento. Trata las excepciones que consideres necesarias.
create
or replace procedure MostrarMasAntiguos
is
       cursor
c_dept
       is
       select
deptno, dname
       from
dept;
       v_nomemp     emp.ename%type;
begin
       for
v_dept in c_dept loop
             v_nomemp:=BuscarMasAntiguo(v_dept.deptno);
             dbms_output.put_line('Departamento: '||v_dept.dname||'
Emp: '||v_nomemp);
       end
loop;
end MostrarMasAntiguos;
create or replace function BuscarMasAntiguo
(p_dept dept.deptno%type)
return emp.ename%type
is
       v_nombre
emp.ename%type;
begin
       select
ename into v_nombre
       from
emp
       where
deptno=p_dept
       and
hiredate=(select min(hiredate)
                    from
emp
                    where
deptno=p_dept);
       return
v_nombre;
exception
       when
NO_DATA_FOUND then
             return
'No tiene empleados';
       when
TOO_MANY_ROWS then
              return 'VARIOS';
end
BuscarMasAntiguo;
Ejercicio
7
Realiza un procedimiento MostrarJefes que reciba el
nombre de un departamento y muestre los nombres de los empleados de ese
departamento que son jefes de otros empleados.Trata las excepciones que consideres
necesarias.
create or replace procedure MostrarJefes
(p_nombre dept.dname%type)
is
       cursor
c_emp
       is
       select
ename
       from
emp
       where
deptno = (select deptno
                    from
dept
                    where
dname=p_nombre)
       and
empno in (select mgr
                       from emp);
       v_ind  number:=0;
begin
       for
v_emp in c_emp loop
             dbms_output.put_line(v_emp.ename);
             v_ind:=1;
       end
loop;
       if
v_ind=0 then
              dbms_output.put_line('Ningún
empleado de '||p_nombre||' es jefe');
       end if;
end MostrarJefes;
Ejercicio 8
Realiza un procedimiento MostrarMejoresVendedores que
muestre los nombres de los dos vendedores con más comisiones. Trata las
excepciones que consideres necesarias.
create
or replace procedure MostrarMejoresVendedores
is
       cursor  c_vend
       is
       select
ename
       from
emp
       order
by comm desc;
       v_vend
c_vend%rowtype;
begin
       open
c_vend;
       fetch
c_vend into v_vend;
       while
c_vend%FOUND and c_vend%ROWCOUNT<=3 
loop
             dbms_output.put_line(v_vend.ename);
       end
loop;
       if
c_vend%ROWCOUNT<2 then
             raise_application_error(-20001,'Hay
menos de dos vendedores con                                                          comisión');
       end if;
       close
c_vend;
end
MostrarMejoresVendedores;
Ejercicio 9
Realiza un procedimiento MostrarsodaelpmE que reciba el
nombre de un departamento al revés y muestre los nombres de los empleados de
ese departamento. Trata las excepciones que consideres necesarias.
Create
or replace procedure MostrarsodaelpmE (p_nombre dept.dname%type)
is
       v_nombredept dept.dname%type;
begin
       v_nombredept:=DevolverCadalReves(p_nombre);
       MostrarEmpleados(v_nombredept);
end
MostrarsodaelpmE;
create or replace procedure
MostrarEmpleados(p_nombre dept.dname%type)
is
       cursor
c_emp
       is
       select
ename
       from
emp
       where
deptno = (select deptno
                        from dept
                        where dname=p_nombre);
begin
       for
v_emp in c_emp loop
             dbms_output.put_line(v_emp.ename);
       end
loop;
end MostrarEmpleados;
create or replace function DevolverCadAlReves(
p_cad VARCHAR2)
return VARCHAR2
is
       v_aux
VARCHAR2(30):='';
begin
       for
i in reverse 1..length(p_cad) loop
             v_aux:=v_aux||substr(p_cad,i,1);
       end
loop;
       return
v_aux;
end  DevolverCadAlReves;
Ejercicio
10
Realiza un procedimiento RecortarSueldos que recorte el
sueldo un 20% a los empleados cuyo nombre empiece por la letra que recibe como
parámetro. Trata las excepciones que consideres necesarias.
create
or replace procedure RecortarSueldos (p_letra VARCHAR2)
is
begin
       update
emp
       set
sal = sal – 0.2*sal
       where
substr(ename, 1, 1)=p_letra;
       if
SQL%NOTFOUND then
             dbms_output.put_line('Ningun
empleado actualizado');
       else
             dbms_output.put_line(SQL%ROWCOUNT||'empleados
actualizados');
       end
if;
end
RecortarSueldos;
Ejercicio 11
Realiza un procedimiento BorrarBecarios que borre a los
dos empleados más nuevos de cada departamento. Trata las excepciones que
consideres necesarias.
Create
or replace procedure BorrarBecarios
is
       cursor
c_dept
       is
       select
deptno
       from
dept;
begin
       for
v_dept in c_dept loop
             BorrarDosMasNuevos(v_dept.deptno);
       end loop;
end BorrarBecarios;
create or replace procedure
BorrarDosMasNuevos(p_deptno dept.deptno%type)
is
       cursor
c_emp
       is
       select
empno
       from
emp
       where
deptno= p_deptno
       order
by hiredate desc;
       v_emp
c_emp%rowtype;
begin
       open
c_emp;
       fetch
c_emp into v_emp;
       while
c_emp%found and c_emp%rowcount<=2 loop
             delete
emp
             where
empno=v_emp.empno;
             fetch
c_emp into v_emp;
       end
loop;
       close
c_emp;
end
BorrarDosMasNuevos;
 
No hay comentarios:
Publicar un comentario