Laboratorio 12 y 13
Short Description
Download Laboratorio 12 y 13...
Description
2014
PRÁCTICA CALIFICADA N° 12 y 13 PAQUETES, PROCEDIMIENTOS, FUNCIONES, TRIGGERS Y CURSORES
OBREGON TORRES, SHIRLEY UNIVERSIDAD CESAR VALLEJO 27/06/2014
--SECCION I
Crear las tablas anteriores en Oracle Or acle 11g con sus respectivas restricciones, teniendo en cuenta la integridad referencial. Luego insertar 5 registros como mínimo en cada Tabla. CREATE TABLE TABLE DESPACHOS DESPACHOS (numero int primary key key, , capacidad int int); ); create table table directores directores (dni char char( (8) primary key key, , nomApels varchar varchar( (40), 40), DniJefe char char( (8), Despacho int int, , foreign key key( (Despacho) Despacho) references references DESPACHOS DESPACHOS( (numero)); numero)); alter table table directores directores add add( ( foreign key key( (DniJefe) DniJefe) references references directores directores( (dni)); dni)); ---------------------------------insert into into DESPACHOS DESPACHOS values values( (1,20); 20); insert into into DESPACHOS DESPACHOS values values( (2,30); 30); insert into into DESPACHOS DESPACHOS values values( (3,40); 40); insert into into DESPACHOS DESPACHOS values values( (4,50); 50); insert into into DESPACHOS DESPACHOS values values( (5,60); 60); -----------------------------------insert into into directores directores values values( ('46937287' '46937287', ,'shirley obregon torres',null, torres' ,null,1 1); insert into into directores directores values values( ('99223457' '99223457', ,'wendy rojas obregon', obregon' ,46937287, 46937287,1); insert into into directores directores values values( ('98765434' '98765434', ,'justin ghio lopez', lopez',46937287, 46937287,2); insert into into directores directores values values( ('87659045' '87659045', ,'kevin vega cuellar',null, cuellar',null,4 4); insert into into directores directores values values( ('99878777' '99878777', ,'ariana mendez angeles', angeles' ,87659045, 87659045,5);
--SECCION II
En base a las tablas anteriores se pide crear un procedimiento almacenado o función almacenada (según sea el caso) para resolver cada una de las consultas siguientes: 1. Mostrar el DNI, nombre y apellidos de todos los directores. create or replace PROCEDURE GESTION.pre01 is cursor c_dir is select dni,nomApels from GESTION.directores; begin for r_dir in c_dir loop dbms_output.put_line('DNI: ' || r_dir.dni); dbms_output.put_line('APELLIDOS Y NOMBRES: ' || r_dir.nomApels); end loop; end pre01;
2. Mostrar los datos de los directores que no tienen jefes. create or replace PROCEDURE GESTION.pre02 is cursor c_dir is select * from GESTION.directores WHERE DniJefe IS NULL; begin for r_dir in c_dir loop dbms_output.put_line('DNI: ' || r_dir.dni); dbms_output.put_line('APELLIDOS Y NOMBRES: ' || r_dir.nomApels); dbms_output.put_line('DESPACHO: ' || r_dir.Despacho); end loop; end pre02;
3. Mostrar el nombre y apellidos de cada director, junto con la c apacidad del despacho en el que se encuentra create or replace function GESTION.F_capacidad(numer number) return number is desp number; begin select capacidad into desp from GESTION.despachos where numero=numer; return desp; end; --llamar la funcion select nomapels,GESTION.F_capacidad(despacho) Funcion_despachos from dbgestion.directores
4. Mostrar el número de directores que hay en cada despacho. create or replace PROCEDURE GESTION.pre04 is cursor c_dir is select despacho,count(DNI)NroDirectores from GESTION.directores group by despacho; begin for r_dir in c_dir loop
dbms_output.put_line('Despacho: ' || r_dir.despacho); dbms_output.put_line('Nro Directores: ' || r_dir.NroDirectores); end loop; end pre04;
5. Mostrar los datos de los directores cuyos jefes no tienen jefes. create or replace PROCEDURE GESTION.pre05 is cursor c_dir is select * from GESTION.directores WHERE DniJefe IS NULL; begin for r_dir in c_dir loop dbms_output.put_line('DNI: ' || r_dir.dni); dbms_output.put_line('APELLIDOS Y NOMBRES: ' || r_dir.nomApels); dbms_output.put_line('DESPACHO: ' || r_dir.Despacho); end loop; end pre05; 6. Mostrar los nombres y apellidos de los directores junto con los de su jefe create or replace PROCEDURE GESTION.pre06 is cursor c_dir is select d.dni,d.nomapels,(select distinct nomapels from GESTION.directores where dni=d.dnijefe) as jefe from GESTION.directores d WHERE d.DniJefe IS not NULL; begin for r_dir in c_dir loop dbms_output.put_line('DNI: ' || r_dir.dni); dbms_output.put_line('APELLIDOS Y NOMBRES: ' || r_dir.nomApels); dbms_output.put_line('JEFE: ' || r_dir.jefe); dbms_output.put_line('--------------------------------'); end loop; end pre06;
7. Mostrar el número de despachos que están sobre utilizados create or replace PROCEDURE GESTION.pre07 is cursor c_dir is SELECT DESPACHO,COUNT(DNI)CANTIDAD FROM DBGESTION.DIRECTORES DI INNER JOIN GESTION.DESPACHOS DE ON DI.DESPACHO=DE.NUMERO GROUP BY DESPACHO,DE.CAPACIDAD having COUNT(DNI)>DE.CAPACIDAD; begin for r_dir in c_dir loop dbms_output.put_line('despacho: ' || r_dir.DESPACHO); dbms_output.put_line('capacidad: ' || r_dir.CANTIDAD); end loop; end pre07; 8. Anadir un nuevo director llamado Paco Pérez, DNI 28301700, sin jefe, y situado en el despacho 124.
create or replace PROCEDURE GESTION.pre08(dni varchar,nombres varchar,jefe varchar,despacho number) As begin insert into GESTION.directores values (dni,nombres,jefe,despacho); end pre08; --ejecutar el procedimiento para insertar begin GESTION.pre08('28301700','Paco Pérez',NULL,124); end;
9. Asignar a todos los empleados apellidados Pérez un nuevo jefe con DNI 74568521 create or replace PROCEDURE GESTION.pre09(apellidos varchar,jefe varchar) As begin update GESTION.directores set dnijefe=jefe where nomapels=apellidos; end pre09; --ejecutar el procedimiento para actualizar begin GESTION.pre09('perez','74568521'); end;
10. Despedir a todos los directores, excepto a los que no tienen jefe create or replace PROCEDURE GESTION.pre10 As begin delete from GESTION.directores where dnijefe is not null; end pre10; --ejecutar el procedimiento para actualizar begin GESTION.pre10; end;
-----seccion III
create or replace package gestion.Preg010 as function GESTION.F_directores(desp number) return number; end Preg010; create or replace package body gestion.Preg010 as function GESTION.F_directores(desp number) return number is dir number; begin select count(*) into dir from GESTION.directores where despacho=desp; return dir; end; end Preg010;
--llamar la funcion select numero,Preg010.F_directores(numero)cantDirectores from gestion.despachos ------------------------------------------------------------------create or replace package gestion.Preg009 as PROCEDURE PrcPre009; end Preg009; create or replace package body gestion.Preg009 as PROCEDURE gestion.PrcPre009 is begin delete from gestion.despachos where numero in((select numero from gestion.DESPACHOS des inner join gestion.directores di on des.numero=di.despacho group by numero,capacidad having capacidad 4)then raise_application_error(-20600,:new.dnijefe || 'no se puede terner mas de 7 directores');
end if; end; end Preg003; ----------------------------------------------------------------------------create or replace package gestion.Preg002 as PROCEDURE PrcPre002; end Preg002; create or replace package body gestion.Preg002 as PROCEDURE gestion.PrcPre002 is cursor c_dir is select dir.dni,(select count(dni) from gestion.directores where dnijefe=dir.dni)CanDir from gestion.directores dir where (select count(dni) from gestion.directores where dnijefe=dir.dni)>5 and dir.dnijefe is null; begin for r_dir in c_dir loop dbms_output.put_line('DNI: ' || r_dir.DNI); dbms_output.put_line('CANDIR: ' || r_dir.candir); end loop; end PrcPre002; end Preg002; ---------------------------------------------------------------create or replace package gestion.Preg001 as PROCEDURE PrcPre001; end Preg001; create or replace package body gestion.Preg001 as create or replace PROCEDURE gestion.PrcPre001 is cursor c_dir is select numero,(capacidad - count(dni)) CapacidadDisponible from gestion.DESPACHOS des inner join gestion.directores di on des.numero=di.despacho group by numero,capacidad; begin for r_dir in c_dir loop dbms_output.put_line('NUMERO: ' || r_dir.numero); dbms_output.put_line('Cap Disponible: ' || r_dir.CapacidadDisponible); end loop; end PrcPre001; end Preg001;
----seccion IV create table g.categoria (cat_id int primary key, cat_categoria varchar(40), cat_descripcion varchar(40)); create table g.producto (pro_id int primary key, cat_id int, pro_nombre varchar(40), pro_cantidad int, pro_unidad varchar(20), pro_precio numeric, pro_stockMinimo int, pro_fechavenc date, foreign key (cat_id) references g.categoria(cat_id));
-----------------------------------------------------------------------insert insert insert insert insert insert insert
into GESTION.CATEGORIA into GESTION.CATEGORIA into GESTION.CATEGORIA into GESTION.CATEGORIA into GESTION.CATEGORIA into GESTION.CATEGORIA into GESTION.CATEGORIA
values(1,'Lentejas','Menestras'); values(2,'Arroz','Arroz'); values(3,'Detergentes','Detergentes'); values(4,'Ferreteria','Ferreteria'); values(5,'Frutas','Frutas'); values(6,'Bebidas','Bebidas'); values(7,'Embutidos','Embutidos');
--------------------------------------------------------------------select * from g.producto INSERT INTO G.PRODUCTO VALUES(1,1,'lenteja',2,'kilos',5,2,TO_DATE('26-062014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(2,1,'alberjas',2,'kilos',4,3,TO_DATE('2606-2014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(3,2,'tomate',5,'kilos',2,1,TO_DATE('26-062014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(4,3,'ariel',6,'kilos',4,2,TO_DATE('26-062014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(5,3,'opal',10,'kilos',4,2,TO_DATE('26-062014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(6,4,'martillo',1,'caja',20,1,TO_DATE('2606-2014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(7,4,'clavos',5,'kilos',10,1,TO_DATE('26-062014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(8,5,'manzanas',1,'caja',10,3,TO_DATE('2606-2014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(9,6,'gaseosa',1,'paquete',1,1,TO_DATE('2606-2014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(10,6,'cerveza',1,'caja',50,1,TO_DATE('2606-2014 07:01','DD-MM-YYYY HH:MI')); INSERT INTO G.PRODUCTO VALUES(11,7,'hogdog',4,'embutidos',5,1,TO_DATE('26-06-2014 07:01','DD-MMYYYY HH:MI'));
1. Mostrar todos los productos con sus respectivas categorías ordenadas alfabéticamente
create or replace package g.Pro1 as PROCEDURE Pro01; end Pro01; create or replace package body db.P1 as PROCEDURE gestion.PrcPre001 is cursor c_prod is select cat.cat_categoria,prod.pro_nombre,prod.pro_cantidad,prod.pro_unidad,prod. pro_precio,prod.pro_fechavenc from DB.categoria cat inner join DB.producto prod on cat.cat_id=prod.cat_id; begin for r_pro in c_prod loop dbms_output.put_line('categoria ' || r_pro.cat_categoria); dbms_output.put_line('producto ' || r_pro.pro_nombre); dbms_output.put_line('cantidad ' || r_pro.pro_cantidad); dbms_output.put_line('producto ' || r_pro.pro_unidad); dbms_output.put_line('producto ' || r_pro.pro_precio); dbms_output.put_line('producto ' || r_pro.pro_fechavenc); end loop; end Pro01; end Pro1;
2. Mostrar los productos más caros
create or replace PROCEDURE g.Pro2 is cursor c_prod is select cat_categoria,prod.pro_nombre,prod.pro_cantidad,prod.pro_unidad,prod.pro_ precio,prod.pro_fechavenc from gestion.categoria cat inner join DB.producto prod on cat.cat_id=prod.cat_id where ROWNUM 3; begin for r_pro in c_prod loop dbms_output.put_line('categoria ' || r_pro.cat_categoria); dbms_output.put_line('cantidad >3 ' || r_pro.cantidad); end loop; end Pro10;
LABORATORIO 13
SESION I create table system.pieza (codigo int primary key, nombre varchar(100))
create table system.proveedores (id char(4) primary key, nombre varchar(100)) create table system.suministra (codigo int, idproveedor char(4), precio decimal(7,2), foreign key (codigo)references system.pieza(codigo), foreign key (idproveedor)references system.proveedores(id)) select * from system.suministra; select * from system.pieza; select * from system.proveedores; -----------------------------------------ingresar registro PIEZAS insert into SYSTEM.PIEZA values(1,'MONITORES'); insert into SYSTEM.PIEZA values(2,'MOUSE'); insert into SYSTEM.PIEZA values(3,'LENTES'); insert into SYSTEM.PIEZA values(4,'DISCO DURO'); insert into SYSTEM.PIEZA values(5,'PLACA'); insert into SYSTEM.PIEZA values(6,'PROCESADOR'); insert into SYSTEM.PIEZA values(7,'MICRO SD'); insert into SYSTEM.PIEZA values(8,'CPU'); insert into SYSTEM.PIEZA values(9,'CASE'); insert into SYSTEM.PIEZA values(10,'TECLADO'); insert into SYSTEM.PIEZA values(11,'TECLADO'); -----------------------------------------ingresar registro PROVEEDOR insert into SYSTEM.PROVEEDORES values('pr01','HP');
insert into SYSTEM.PROVEEDORES values('pr02','SAMSUNG'); insert into SYSTEM.PROVEEDORES values('pr03','LG'); insert into SYSTEM.PROVEEDORES values('pr04','DELL'); insert into SYSTEM.PROVEEDORES values('pr05','ASUS'); insert into SYSTEM.PROVEEDORES values('pr06','APPLE'); insert into SYSTEM.PROVEEDORES values('pr07','TOSHIBA'); insert into SYSTEM.PROVEEDORES values('pr08','THINKPAD'); insert into SYSTEM.PROVEEDORES values('pr09','AMD'); insert into SYSTEM.PROVEEDORES values('pr10','INTEL'); -----------------------------------------ingresar registro suminstra insert into SYSTEM.suministra values (1,'pr10',12.3); insert into SYSTEM.suministra values (2,'pr09',15.3); insert into SYSTEM.suministra values (3,'pr08',11.3); insert into SYSTEM.suministra values (4,'pr07',19.3); insert into SYSTEM.suministra values (5,'pr06',21.3); insert into SYSTEM.suministra values (6,'pr05',34.3); insert into SYSTEM.suministra values (7,'pr04',22.3); insert into SYSTEM.suministra values (8,'pr03',56.3); insert into SYSTEM.suministra values (9,'pr02',34.3); insert into SYSTEM.suministra values (10,'pr01',23.3); SESION II
1. Obtener los nombres de todas las piezas. create or replace procedure system.proc01 as cursor c_proc01 is select * from system.pieza; begin for r_proc01 in c_proc01 loop dbms_output.put_line('CODIGO ' || r_proc01.CODIGO); dbms_output.put_line('CODIGO ' || r_proc01.NOMBRE); end loop; end; begin system.proc01; end;
2. Obtener todos los datos de todos los proveedores. create or replace procedure system.proc02 as cursor c_proc02 is select * from system.proveedores; begin for r_proc02 in c_proc02 loop dbms_output.put_line('ID ' || r_proc02.ID ); dbms_output.put_line('NOMBRE ' || r_proc02.NOMBRE ); end loop; end; begin system.proc02; end;
3. Obtener el precio medio al que se nos suministran las piezas. create or replace procedure system.proc03 as cursor c_media is select avg(precio)as medio from SYSTEM.suministra;
med c_media %rowtype; begin open c_media; fetch c_media into med; dbms_output.put_line('medio' || ' ' || med.medio); close c_media; end; begin system.proc03; end;
4. Obtener los nombres de los proveedores que suministran la pieza 1. create or replace procedure system.proc04 as cursor c_proc04 is select p.nombre from system.suministra s inner join system.proveedores p on s.idproveedor=p.id inner join system.pieza pi on s.codigo=pi.codigo; begin for r_proc04 in c_proc04 loop dbms_output.put_line('proveedor ' || r_proc04.nombre ); end loop; end; begin system.proc04; end;
5. Obtener los nombres de las piezas suministradas por el proveedor cuyo código es HAL. create or replace procedure system.proc05 as cursor c_proc05 is select PI.NOMBRE from system.suministra s inner join system.proveedores p on s.idproveedor=p.id inner join system.pieza pi on s.codigo=pi.codigo where p. id='HAL'; begin for r_proc05 in c_proc05 loop dbms_output.put_line('PIEZAS ' || r_proc05.NOMBRE ); end loop; end; begin system.proc05; end;
6. Obtener los nombres de los proveedores que suministran las piezas más caras, indicando el nombre de la pieza y el precio al que la suministran. create or replace procedure system.proc06 as cursor c_proc06 is select p.nombre proveedor,pi.nombre pieza,s.precio from system.suministra s inner join system.proveedores p on s.idproveedor=p.id inner join system.pieza pi on s.codigo=pi.codigo order by precio desc; begin for r_proc06 in c_proc06 loop dbms_output.put_line('proveedor ' || r_proc06.proveedor );
dbms_output.put_line('pieza ' || r_proc06.pieza ); dbms_output.put_line('precio ' || r_proc06.precio ); end loop; end; begin system.proc06; end;
7. Aumentar los precios en una unidad. create or replace procedure system.proc07(aumento decimal) as begin update system.suministra set precio=precio + aumento; end; begin system.proc07(10); end;
SESION III --1. declare cursor c_prov is select * from system.proveedores; cursor c_pieza(prov char) is select pi.nombre pieza,s.precio from system.suministra s inner join system.pieza pi on s.codigo=pi.codigo where s. idproveedor=prov; begin for r_prov in c_prov loop dbms_output.put_line('proveedor '||r_prov.nombre); for r_pie in c_pieza(r_prov.id) loop dbms_output.put_line('pieza '||r_pie.pieza); dbms_output.put_line('precio '||r_pie.precio); end loop; dbms_output.put_line('---------------------------------------------'); end loop; end; --2. declare cursor c_pieza is select * from system.pieza; cursor c_prov(pie char) is select p.nombre proveedor,s.precio from system.suministra s inner join system.proveedores p on s.idproveedor=p.id where s.codigo=pie; begin for r_pie in c_pieza loop dbms_output.put_line('pieza '||r_pie.nombre); for r_prov in c_prov(r_pie.codigo) loop dbms_output.put_line('proveedor '||r_prov.proveedor); dbms_output.put_line('precio '||r_prov.precio); end loop; dbms_output.put_line('---------------------------------------------');
end loop; end;
--3. create or replace trigger system.Tig003 before insert on system.pieza for each row declare dir integer:=1; cursor pie is select * from system.pieza; begin for r_ll in pie loop if (r_ll.nombre=:new.nombre)then dir:=2; end if; end loop; if(dir=2)then raise_application_error(-20600,:new.nombre || 'este director esta registrado'); end if; end; --4. create or replace function system.Fun_aumento10(precio number) return number is aumento number; begin aumento:=precio+(precio*0.10); return aumento; end; select p.nombre proveedor,pi.nombre pieza,s.precio,system.Fun_aumento10(s.precio) aumento10 from system.suministra s inner join system.proveedores p on s.idproveedor=p.id inner join system.pieza pi on s.codigo=pi.codigo order by precio desc; --5. create or replace procedure pro005 as cursor c_pre005 is select p.nombre proveedor,count(pi.codigo) from system.suministra s inner join system.proveedores p on s.idproveedor=p.id inner join system.pieza pi on s.codigo=pi.codigo group by p.nombre having count(pi.codigo)>2; begin for r_pre005 in c_pre005 loop dbms_output.put_line('proveedor '||r_pre005.proveedor); end loop; end; begin system.pro005; end; --6.
declare cursor c_prov(proid char) is select * from SYSTEM.proveedores where id=proid; regis c_prov %rowtype; begin open c_prov('pr01'); fetch c_prov into regis; dbms_output.put_line('medio' || ' ' || regis.id); dbms_output.put_line('medio' || ' ' || regis.nombre); close c_prov; end; --7. create or replace procedure pre007 as cursor c_pre007 is select p.nombre proveedor from system.suministra s inner join system.proveedores p on s.idproveedor=p.id inner join system.pieza pi on s.codigo=pi.codigo group by p.nombre having count(pi.codigo)=02; begin for r_pre007 in c_pre007 loop dbms_output.put_line('proveedor '||r_pre007.proveedor); end loop; end; begin system.pre007; end; --9. create or replace procedure system.pre009 as cursor c_pre009 is select p.nombre proveedor,s.precio,pi.nombre from system.suministra s inner join system.proveedores p on s.idproveedor=p.id inner join system.pieza pi on s.codigo=pi.codigo order by s.precio desc; begin for r_pre009 in c_pre009 loop dbms_output.put_line('proveedor '||r_pre009.proveedor); dbms_output.put_line('precio '||r_pre009.precio); dbms_output.put_line('pieza '||r_pre009.nombre); end loop; end; begin system.pre009; end; --10.- cre create or replace procedure system.pre010(con char,id_i int,nombre_i varchar) as begin if con='insertar' then insert into system.pieza values (id_i,nombre_i); end if; if con='actualizar' then update system.pieza set nombre=nombre_i where codigo=id_i;
end if; if con='eliminar' then delete from system.pieza where codigo=11; end if; end; declare alta char(10):='insertar'; modif char(10):='actualizar'; elim char(10):='eliminar'; begin system.pre010(alta,11,'carbons'); system.pre010(modif,11,'carbones de fierror'); system.pre010(elim,11,'adios registro'); end;
View more...
Comments