sábado, 16 de agosto de 2014

PL/SQL. Práctica infantil

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