Actividad Virtual Base de Datos Avanzados 2 Cibertec

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 6

2398 - Base de Datos Avanzado II

Actividad Virtual 07
Objetivo
Crear Procedimientos Almacenados y Funciones.

Realizar los siguientes requerimientos con el usuario “HR”:

1) Elaborar una función FN_ULTI_CARA_EMAI_EMPL que al ingresar el código de empleado de la


tabla EMPLOYEES me retorne el último carácter del email de empleado aplicando el formato
para que aparezcan 4 arrobas a la izquierda y 4 a la derecha. En caso no existiese, usando
excepciones retorne un mensaje ‘Código de empleado no existe’ mediante el gestor
NO_DATA_FOUND.

set serveroutput on;

create or replace function FN_ULTI_CARA_EMAI_EMPL (ultima varchar2)


return varchar2 is
begin
return rpad(lpad((substr(ultima,-1)),5,'@'),9,'@');
end;

declare
emaile varchar2(10);
idempleado varchar2(3);
begin
select email into emaile from employees where employee_id = idempleado;
emaile:=FN_ULTI_CARA_EMAI_EMPL(emaile);
dbms_output.put_line(emaile);
exception
when no_data_found then
dbms_output.put_line('Código de empleado no existe');
end;
2) Elaborar una función FN_SUTO_SALA_EMPL_OFIC que al ingresar el oficio de empleado de la
tabla EMPLOYEES me retorne la sumatorio total del salario de los empleados de dicho oficio.
En caso no exista ningún empleado con dicho oficio generar una Excepción que lance el mensaje
“No existe empleados con dicho oficio”.

create or replace function FN_SUTO_SALA_EMPL_OFIC (sumatoria varchar2)


return varchar2 is
begin
return sumatoria;
end;

declare
salario number;
begin
select sum(salary) into salario from employees where job_id = 'ST_MAN';
salario:=FN_SUTO_SALA_EMPL_OFIC(salario);
dbms_output.put_line(salario);
exception
when no_data_found then
dbms_output.put_line('Código de empleado no existe');
end;
3) Elaborar un Procedimiento Almacenado SP_REGI_OFIC que realice una inserción de registros a
la tabla JOBS. Usando excepciones predefinidas muestre el mensaje “Ya existe un oficio con el
código ingresado” a través del gestor DUP_VAL_ON_INDEX y muestre el número y mensaje de
error de las funciones SQLCODE y SQLERRM a través del gestor OTHERS.

create procedure SP_REGI_OFIC(id_job in jobs.job_id%type,


titulo_job in jobs.job_title%type,
salario_min in jobs.min_salary%type,
salario_max in jobs.max_salary%type)
as
begin
insert into jobs(job_id, job_title, min_salary, max_salary)
values(id_job,titulo_job,salario_min,salario_max);
exception
when DUP_VAL_ON_INDEX then
dbms_output.put_line('Ya existe el codigo');
dbms_output.put_line(SUBSTR(SQLERRM, 1, 100));
end;

begin
SP_REGI_OFIC('RZ_RAZ', 'TITULO', 5000,50000);
end;
4) Elaborar un Procedimiento Almacenado SP_LIST_EMPL_OFIC_DEPA que reciba el oficio y el
departamento y luego muestre el código, el nombre y el apellido concatenado, el correo, la
fecha de contratación y el salario de todos los empleados (tabla EMPLOYEES). En caso no exista
el oficio o el departamento, usando excepciones definidas por el usuario envíe los siguientes
mensajes “No existe el oficio y el departamento”, “El oficio no existe” y “El departamento no
existe”.
create or replace procedure SP_LIST_EMPL_OFIC_DEPA
(id_job in varchar2, id_dept in number, cur_return out sys_refcursor)
as
msj_error varchar2(200);
num_error number;
sms1 exception;
sms2 exception;
sms3 exception;
exist_job number;
exist_dpt number;
begin
select count(*) into exist_dpt from Employees
where department_id = id_dept;
select count(*) into exist_job from Employees
where job_id = id_job ;
if exist_dpt = 0 and exist_job = 0 then
raise sms3;
elsif exist_dpt=0 then
raise sms2;
elsif exist_job=0 then
raise sms1;
else
open cur_return for
select
employee_id, first_name||' '||last_name as Nombre_Completo, email,
hire_date, salary
from Employees
Where department_id = id_dept and JOB_ID=id_job;
end if;
exception
when sms1 then
RAISE_APPLICATION_ERROR(-20001,'el oficio no existe');
when sms2 then
RAISE_APPLICATION_ERROR(-20001,'El departamento no existe');
when sms3 then
RAISE_APPLICATION_ERROR(-20001,'No existe el oficio y el departamento');
when others then
num_error := SQLCODE;
msj_error := SQLERRM;
raise_application_error(-20001,
'Error en el ingreso de datos '
||'Codigo de Error = ' ||SQLCODE ||' Error: ' || SQLERRM);
end;

set autoprint on;


variable exitt refcursor;
execute SP_LIST_EMPL_OFIC_DEPA('AD_PRES',90,:exitt);

También podría gustarte