You are on page 1of 12

Práctico N 4 Tópicos Avanzados de Base de Datos 2016

Ejercicio1​:

a) Implemente el tipo complejo que consta de dos partes una real y otra imaginaria, ambas
dentro del rango de los números reales. Además de definir las operaciones matemáticas:
Suma: Debe tener como parámetro un numero complejo que debe sumarse al complejo
sobre el que se invoca.
Resta: ​Idem anterior.
Orden​: Función de ordenamiento tipo map. Debe devolver la parte real del complejo.
b) Cree una tabla cuyas tuplas almacenen nros. complejos.
c) Inserte tuplas.
d) Recupere toda la tabla.
e) Muestre el resultado de aplicar las funciones:
i. Suma de un número complejo a todas las tuplas de la tabla.
ii. Resta de un número complejo a todas las tuplas de la tabla.
iii. Muestre la tabla completa en orden descendente.

create or replace type complejo as object


(preal number,
pimaginario number,
member function suma(x complejo) return complejo,
member function resta(x complejo) return complejo,
member function sumareal(x number) return complejo,
map member function fmap return number
);

create or replace type body complejo as


member function suma(x complejo) return complejo is
aux complejo;
begin
aux:=complejo(0,0);
aux.preal:=self.preal+x.preal;
aux.pimaginario:=self.pimaginario+x.pimaginario;
return aux;
end;
member function resta(x complejo) return complejo is
aux complejo;
begin
aux:=complejo(0,0);
aux.preal:=self.preal-x.preal;
aux.pimaginario:=self.pimaginario-x.pimaginario;
return aux;
end;
member function sumareal(x number) return complejo is
aux complejo;
begin
aux:=complejo(0,0);
Práctico N 4 Tópicos Avanzados de Base de Datos 2016

aux.preal:=self.preal+x;
return aux;
end;
map member function fmap return number is
begin
return self.preal;
end;
end;

--create table tcomplejo of complejo;

/*

insert into tcomplejo values(complejo(2,1));

insert into tcomplejo values(complejo(2,5));

insert into tcomplejo values(complejo(6,1));

*/

--select value(p) from hr_xml.tcomplejo p;

--select p.* from tcomplejo p;

select a.resta(complejo(10,10)) from tcomplejo a;

--select a.preal, a.pimaginario from tcomplejo a;


Práctico N 4 Tópicos Avanzados de Base de Datos 2016

Ejercicio 2​: Usando el tipo definido en el ejercicio anterior, realice:

a) Implemente un tipo colección arreglo_complejos como que un arreglo de 5 nros.


complejos.
b) Defina un tipo objeto tipo_arreglo_complejos que incluya:
● Elemento llamado ​arreglo​: del tipo colección arreglo_complejos
● Método ​suma​: que devuelva la suma de los valores guardados en el elemento
arreglo.
c) Defina una tabla que almacene obje
d) tos del tipo tipo_arreglo_complejos.
e) Inserte al menos 2 tuplas a la tabla.
f) Muestre la tabla completa.
g) Muestre el resultado de aplicar la función suma a todas las tuplas de la tabla.

--create type arreglo_complejo as varray (5) of complejo;


/*create or replace type tipo_arreglo_complejo as object
(arreglo arreglo_complejo,
member function sumaarr return complejo
);

create or replace type body tipo_arreglo_complejo as


member function sumaarr return complejo is
aux complejo;
begin
aux:=complejo(0,0);
for i in 1..5 loop
aux:=aux.suma(self.arreglo(i));
end loop;
return aux;
end;
end;
*/

--create table tarrcomplejo of tipo_arreglo_complejo;


--insert into tarrcomplejo
values(arreglo_complejo(complejo(6,7),complejo(4,3),complejo(8,3),complejo(4,1),complejo(7
,6)));
--insert into tarrcomplejo
values(arreglo_complejo(complejo(6,9),complejo(8,3),complejo(4,1),complejo(1,1),complejo(5
,6)));
--select * from tarrcomplejo;
select a.sumaarr() from tarrcomplejo a;
Práctico N 4 Tópicos Avanzados de Base de Datos 2016

Ejercicio 3​: Se le pide que realice los siguientes ítems sobre las diferentes realidades planteadas.
a. Diseñar el modelo de objetos.
b. Definir e implementar los tipos correspondientes.
c. Crear las tablas necesarias.
d. Insertar tuplas en las tablas creadas.
e. Efectuar consultas planteadas en cada caso.
Caso a. Se desea implementar un modelo objeto-relacional de una empresa mayorista que
describa:
̶ Repartidores, detallando para ellos: dni, nombre y teléfono.
̶ Localidades, detallando en este caso el nombre de la localidad y el código postal
correspondiente.
̶ Cada repartidor atiende una localidad y cada localidad es manejada por sólo un repartidor. Es
necesario conocer para cada repartidor la localidad que le corresponde y viceversa. La
existencia de ambas entidades es independiente una de la otra. Defina la función map sobre el
atributo dni.
Las consultas a implementar son:

1. Muestre la tabla completa de localidades.


2. Muestre la tabla completa de repartidores ordenada descendentemente por dni.
Muestre el nombre de cada repartidor junto al nombre de la localidad que atiende.
(Consulta simple sobre la tabla de repartidores).
3. Muestre para cada localidad su nombre y su repartidor (objeto).
4. Modifique el código postal de la localidad Rivadavia.

create type repartidor;

create type localidad as object


(nombre varchar2(20),
cp number,
rep ref repartidor);

create type repartidor as object


( nombre varchar2(20),
dni number,
telefono number,
loc ref localidad,
map member function fmap return number);

create or replace type body repartidor as


map member function fmap return number is
begin
return self.dni;
end;
end;
Práctico N 4 Tópicos Avanzados de Base de Datos 2016

--create table trepartidor of repartidor;


--create table tlocalidad of localidad;

/*insert into trepartidor values('juan',1,555555,null);


insert into tlocalidad values('capital',5400,(select ref(r) from trepartidor r where r.dni=1));
update trepartidor set loc=(select ref(l) from tlocalidad l where l.cp=5400) where dni=1;*/

--insert into trepartidor values('pepe',2,777777,null);


--insert into tlocalidad values('santa lucia',5411,(select ref(r) from trepartidor r where
r.dni=2));
--update trepartidor set loc=(select ref(l) from tlocalidad l where l.cp=5411) where dni=2;

--select * from tlocalidad;


--select dni, nombre, deref(r.loc).nombre from trepartidor r order by value(r) desc;

--select nombre, deref(l.rep).nombre from tlocalidad l;

--update tlocalidad l set l.cp=4000 where l.nombre='santa lucia';

--select nombre, cp from tlocalidad;


Práctico N 4 Tópicos Avanzados de Base de Datos 2016

Caso b. Se desea implementar un modelo que describa la currícula de las carreras de una
facultad. De las carreras se debe registrar nombre y cantidad de años de duración. De las
materias, código, nombre, despliegue y forma de aprobación. Otro aspecto importante a
considerar es que en la relación carrera-materia la visibilidad que se requiere es desde carrera
hacia materias solamente. Las instancias de carreras y materias son independientes.
Las consultas a implementar son:

Muestre nombre, duración y cantidad de materias de las carreras registradas.


Muestre cada carrera junto a la información de las materias que le corresponden.

create type materia as object


(codigo number,
nombre varchar2(20),
despliegue varchar2(20),
faprobacion varchar2(20)
);

create type materias as table of materia;

create type carrera as object


(nombre varchar2(20),
años number,
mat materias);
/*create table tcarrera of carrera nested table mat store as lista_materias;

insert into tcarrera values('LCC', 5,


materias(
materia(1, 'base de datos', 'semestral', 'regular'),
materia(2, 'fundamentos', 'semestral', 'seudopromocional')
)
);
Práctico N 4 Tópicos Avanzados de Base de Datos 2016

insert into tcarrera


values('LSI', 48,
materias(
materia(1, 'la de la bebi', 'anual', 'libre'),
materia(2, 'las tapas de inodoro', 'semanal', 'no se'),
materia(3, 'la otra de la bebi', 'trimestral', 'a veces')
)
);
*/

select c.cnombre, c.años, count(*)


from tcarrera c, table(c.mat) amat
group by c.cnombre, c.años;

select c.cnombre, amat.*


from tcarrera c, table(c.mat) amat;

select c.cnombre, value(c.mat)


from tcarrera c;
Práctico N 4 Tópicos Avanzados de Base de Datos 2016

Caso c. Una librería mayorista lo ha contratado para implementar una base de datos que
mantenga información relativa a sus productos, clientes y facturas de venta. Un cliente además de
tener su nro. de cliente y nombre, tiene como información de contacto, su dirección (calle,
orientación y nro.) y 2 teléfonos. La dirección y los teléfonos son exclusivos de sólo un cliente.
Dentro de los clientes se pueden distinguir mayoristas y minoristas. De los mayoristas se debe
registrar el nombre del encargado, y de los minoristas el monto máximo que se le otorga de
crédito. Se debe generar un procedimiento mostrar, que muestre todos los datos de los clientes
según correspondan a mayoristas o minoristas.
Cada factura posee un nro. único y una fecha. Un cliente puede generar muchas facturas de venta,
pero cada factura corresponde a sólo un cliente. Una factura obviamente puede incluir varios
productos diferentes, con su cantidad y precio unitario. Los productos son descriptos por su
código, nombre y precio actual.

Es requisito generar un método que devuelva para una factura el total correspondiente. Además
se debe implementar también una función de ordenamiento (map) para facturas, basada en su nro
.

Las consultas a implementar son:

Muestre el número de la factura junto al importe total, ordenado por número de factura en
forma ascendente.
Muestre los datos correspondientes a los clientes minoristas.
Eliminar un producto de una factura.

create or replace type direccion;

create or replace type telefonos as varray(2) of number;

create or replace type cliente as object

(nrocli number,

nombre varchar2(20),

tel telefonos,

dir ref direccion) not final;


Práctico N 4 Tópicos Avanzados de Base de Datos 2016

create or replace type direccion as object

( calle varchar2(20),

nrodir number,

orientacion varchar2(20));

create or replace type mayorista under cliente

(encargado varchar2(20)

);

create or replace type minorista under cliente

(maxcredito number

);

create or replace type producto as object

(cod number,

nomprod varchar2(20),

precio number

);

create or replace type item as object

(cantidad number,

precio number,

prod ref producto

);
Práctico N 4 Tópicos Avanzados de Base de Datos 2016

create or replace type listaitem as table of item;

create or replace type factura as object

(nrofac number,

fecha varchar2(20),

cli ref cliente,

items listaitem,

member function total return number,

map member function fmap return number

);

create or replace type body factura as

map member function fmap return number is

begin

return self.nrofac;

end;

member function total return number is

aux number;

begin

aux:=0;

for i in 1..self.items.count() loop

aux := aux + self.items(i).precio * self.items(i).cantidad;

end loop;

return aux;

end;
Práctico N 4 Tópicos Avanzados de Base de Datos 2016

end;

--create table tcliente of cliente;

--create table tfacturas of factura nested table items store as listaitems;

--create table tproducto of producto;

--insert into tcliente values(minorista(2, 'antro bar luis',telefonos(143,656),null, 6));

--insert into tcliente values(mayorista(3, 'cafe america',telefonos(123,456),null,'la baby'));

--insert into tproducto values (1,'cafe',30);

--insert into tproducto values (2,'leche',20);

--insert into tproducto values (3,'pan',10);

/*insert into tfacturas values(1,'hoy', (select ref(r) from tmayorista r where r.nrocli=1),

listaitem(

item(45, 30, (select ref(r) from tproducto r where r.cod=1)),

item(10, 20, (select ref(r) from tproducto r where r.cod=2)),

item(20, 10, (select ref(r) from tproducto r where r.cod=3))

);*/

--select nrofac, a.total() from tfacturas a order by value(a) desc;

--delete table(select i.items from TFACTURAS i where i.nrofac=2) aux

--where aux.prod.cod=2;
Práctico N 4 Tópicos Avanzados de Base de Datos 2016

select value(p) from tcliente p where value(p) is of (cliente);

You might also like