C:\Resolucion Parcial BD 12.sql

Anuncio
C:\Resolucion Parcial BD 12.sql
create table especializacion (
codespecial smallint primary key,
nomespecial nvarchar(30),
preciohora money
);
create table rubro (
codrubro smallint primary key,
nombrerubro nvarchar(40)
);
--1. Creación de tablas
create table empleado (
cuil bigint primary key,
nomempl nvarchar(40),
codespecial smallint references especializacion --sólo hace falta el nombre del campo si es
diferente en la otra tabla
);
create table empleador (
cuit bigint primary key,
nomempresa nvarchar(40),
codrubro smallint references rubro
);
create table trabajo (
codtrabajo smallint primary key,
descripcion nvarchar(40),
tipo nvarchar(10),
cuil bigint references empleado,
cuit bigint references empleador
);
create table trabajosxfecha (
codtrabajo smallint references trabajo,
fechainicio smalldatetime,
fechafinaliz smalldatetime,
hstrabajadastotales smallint,
primary key (codtrabajo, fechainicio) --clave concatenada
);
--2. Muestre la cantidad de trabajos que realizó cada empleado
select cuil, count(*) from trabajo group by cuil;
--3. Indicar el importe total pagado en cada trabajo
select trabajo.codtrabajo, sum(preciohora*hstrabajadastotales)
from trabajo
inner join trabajosxfecha on trabajo.codtrabajo = trabajosxfecha.codtrabajo
inner join empleado on trabajo.cuil = empleado.cuil
inner join especializacion on empleado.codespecial = especializacion.codespecial
group by trabajo.codtrabajo;
--en vez de inner join se puede utilizar pareo de tablas
select trabajo.codtrabajo, sum(preciohora*hstrabajadastotales)
from trabajo, trabajosxfecha, empleado, especializacion
where trabajo.codtrabajo = trabajosxfecha.codtrabajo
and trabajo.cuil = empleado.cuil
and empleado.codespecial = especializacion.codespecial
group by trabajo.codtrabajo;
--usando alias de tabla
select t.codtrabajo, sum(preciohora*hstrabajadastotales)
from trabajo t, trabajosxfecha tf, empleado e, especializacion es
where t.codtrabajo = tf.codtrabajo
and t.cuil = e.cuil
and e.codespecial = es.codespecial
group by t.codtrabajo;
--4. Usando subconsultas muestre los trabajos en que trabajaron
1
C:\Resolucion Parcial BD 12.sql
2
-empleados cuya especialización es electricista
select * from trabajo
where cuil IN (select cuil from empleado
where codespecial = (select codespecial from especializacion
where nomespecial = 'Electricista')
);
--5. Usando subconsultas muestre los trabajos que corresponden al nombre de rubro “Seguridad”
select * from trabajo
where cuit IN (select cuit from empleador
where codrubro = (select codrubro from rubro
where nombrerubro = 'Seguridad')
);
--6. Obtener la suma total de hs. Trabajadas por empleado
select trabajo.cuil, sum(hstrabajadastotales)
from trabajo
inner join trabajosxfecha on trabajo.codtrabajo = trabajosxfecha.codtrabajo
group by trabajo.cuil;
--7. Muestre el Nombre del Empleado, el Nombre del Empleador
-para todos los trabajos de tipo “Urgente”.
select * from trabajo
inner join empleado on trabajo.cuil = empleado.cuil
inner join empleador on trabajo.cuit = empleador.cuit
where tipo = 'Urgente';
--8. Realice un procedimiento al cual se le pase como parámetro el Cuil del Empleado
-y obtenga en una consulta el total general cobrado por el mismo.
create procedure sp_cobrado @cuil bigint
--alter procedure sp_cobrado @cuil bigint
as
declare @total money;
set @total = 0;
begin
set @total = (select sum(preciohora*hstrabajadastotales)
from trabajosxfecha
inner join trabajo on trabajosxfecha.codtrabajo = trabajo.codtrabajo
inner join empleado on trabajo.cuil = empleado.cuil
inner join especializacion on empleado.codespecial = especializacion.
codespecial
where trabajo.cuil = @cuil);
--debe mostrar sino no se ve el resultado
print ('Cobrado: '+cast(@total as varchar));
end;
exec sp_cobrado 44444444444;
--para comprobar
select *
from trabajosxfecha
inner join trabajo on trabajosxfecha.codtrabajo = trabajo.codtrabajo
inner join empleado on trabajo.cuil = empleado.cuil
inner join especializacion on empleado.codespecial = especializacion.
codespecial
where trabajo.cuil = 44444444444;
--En ORACLE:
create or replace procedure sp_cobrado (cc in number) is
total number:=0;
begin
select sum(preciohora*hstrabajadastotales) into total
from trabajosxfecha
inner join trabajo on trabajosxfecha.codtrabajo = trabajo.codtrabajo
inner join empleado on trabajo.cuil = empleado.cuil
inner join especializacion on empleado.codespecial = especializacion.
codespecial
C:\Resolucion Parcial BD 12.sql
where trabajo.cuil = cc;
dbms_output.put_line('Cobrado: '||total);
end;
--9. Realice un procedimiento a la cual se le pase como parámetro la fecha de inicio,
-con la misma cargue un cursor con todos los registros de Trabajos por Fechas,
-y luego muestre por pantalla los códigos de trabajo y la fecha de finalización de dicho
cursor.
--En ORACLE:
create or replace procedure sp_cursor (fi date) is
begin
declare
cursor cr_trabajos is
select *
from trabajosxfecha
where fechainicio=fi;
v_registro cr_trabajos%ROWTYPE;
begin
open cr_trabajos;
loop
fetch cr_trabajos into v_registro;
exit when cr_trabajos%NOTFOUND;
dbms_output.put_line('Código de Trabajo: '||v_registro.codtrabajo);
dbms_output.put_line('Fecha de Finalización: '||v_registro.fechafinaliz);
dbms_output.put_line(' ');
end loop;
close cr_trabajos;
end;
end;
--10. Realice un trigger que en el caso de querer ingresar un Empleado con nombre “Juan”,
-muestre por pantalla un mensaje que diga “Llamar al supervisor”.
--En ORACLE:
create or replace trigger tr_juan
before insert
on empleado
for each row
when (new.nomempl ='Juan')
begin
dbms_output.put_line('Debe llamar al supervisor');
end;
3
Descargar