Você está na página 1de 9

Universidad Mariano Glvez de Guatemala

Facultad de Ingeniera en Sistemas


Curso Diseo de Base de Datos
8. Ciclo
Ing. MA. Marcos Ely Urizar Gil
_____________________________________________________________________

Objetos en Oracle
Definicin de un objeto
Para definir un objeto se crea un nuevo tipo.
Se crea un constructor por defecto que debe recibir los atributos en el orden en el
que se hayan definido al crear el nuevo tipo
A) Creamos un objeto del tipo TABLON con 2 atributos (largo y ancho) y 3
mtodos (area, perimetro y precio al que se le pasar un precio por metro
cuadrado):
create or replace TYPE TABLON AS OBJECT (
largo integer,
ancho integer,
member function area return integer,
member function perimetro return integer,
member function precio (p float) return float
);
B) Definimos el cuerpo del objeto (la definicin de los mtodos)
create or replace TYPE BODY TABLON AS
member function area return integer AS
resultado integer;
BEGIN
resultado:=largo*ancho;
RETURN resultado;
END area;

member function perimetro return integer AS


resultado integer;
BEGIN
resultado:=2*largo+2*ancho;
RETURN resultado;
END perimetro;
member function precio (p float) return float AS
resultado float;
BEGIN
resultado:=area*p;
RETURN resultado;
END precio;
END;

Uso de sentencias SQL con objetos:


Creacin de tablas en las que uno de los campos es un objeto.

Crearemos una tabla llamada


mueble que contiene objetos del tipo TABLON (ver dibujo) :

CREATE TABLE MUEBLE ( NUMERO INT, CANTIDAD INT, ELEMENTO


CHEMA.TABLON);

Insercin de registros en la tabla MUEBLE


Creamos los registros del mueble:
insert into mueble values(1,2,new tablon(180,30));
insert into mueble values(2,3,new tablon(100,30));
insert into mueble values(3,1,new tablon(120,30));
Operaciones sobre el mueble:
Ver los componentes: select * from mueble m;

Dimensiones de las tablas: select m.cantidad,m.elemento.largo,m.elemento.ancho


from mueble m;

Areas, permetros y coste de cada tabla (a 23 /m2): select


m.cantidad,m.elemento.area(),m.elemento.perimetro(),m.elemento.precio(0.0023
) from mueble m;

Precio total del mueble (a 23 /m2): select


sum(m.cantidad*m.elemento.precio(0.0023)) from mueble m; ------> 53,82

Se pueden hacer condiciones como m.elemento.area()<100;


operaciones de actualizacin como update mueble m set
m.elemento.largo=200 where numero=1; para hacer el mueble de 200 cm
de alto en vez de 180

Uso de objetos en funciones


create or replace FUNCTION funcion_con_objeto(a int,b int) RETURN
VARCHAR2 AS
r1 tablon;
BEGIN
r1 := NEW tablon(a,b);
return 'El area es '||r1.area();
END;
select funcion_con_objeto(10,20) from dual; devuelve el texto El area es 200

Atributos multivaluados
La 1FN indica que no deben asistir atributos multivaluados. Sin embargo, en
BDOO se puede crear atributos que puedan tener ms de un valor y ser
manejados de una forma sencilla
Colecciones
Es un grupo de elementos del mismo tipo. Por ejemplo, supongamos que se desea
almacenar datos atmicos de los empleados de una empresa (por ejemplo, el
nombre) junto con el nombre de sus hijos (multivaluado). En BD relacionales se
generan 2 tablas: empleados e hijos. La FK de hijos es la PK de empleados. En
BD OO se creara una coleccin:
Tipos - Nuevo Tipo - Nombre=colec_hijos - Tipo=tipo de matriz - Definir Compilar
CREATE OR REPLACE TYPE COLEC_HIJOS AS VARRAY(10) OF
varchar2(30) ;

De esta forma, se define el tipo colec_hijos que puede almacenar un mximo


de 10 hijos, cada uno con hasta 30 caracteres en su nombre
Una vez definida la coleccin, se puede crear la tabla empleado que contiene un
campo del tipo colecc_hijos
CREATE TABLE "CHEMA"."EMPLEADO" (
"ID"
NUMBER,
"NOMBRE" VARCHAR2(20 BYTE),
"APELLIDOS" VARCHAR2(20 BYTE),
"HIJOS" "CHEMA"."COLEC_HIJOS" ,
CONSTRAINT "PRK1" PRIMARY KEY ("ID")
)
A continuacin se pueden insertar registros en la tabla empleado y seleccionarlos:

No es posible acceder a los elementos individuales de una coleccin desde un


comando SQL. Es preciso realizar un programa PL-SQL

Tablas anidadas
Existe la posibilidad de no limitar la cantidad de valores dentro del atributo
multivaluado, haciendo que el campo sea del tipo tabla
En el ejemplo anterior, el nmero mximo de hijos era de 10. Podemos hacerlo
ilimitado definiendo un tipo tabla:
CREATE OR REPLACE TYPE TABLA_HIJOS AS TABLE OF
varchar2(30);
Despus se crea la tabla empleado con un campo del tipo tabla_hijos. Es preciso

desde el editor de la tabla dar un nombre a la tabla anidada -nested table- (en
nuestro caso t_hijos)
De esta forma se pasa de tablas de 2 dimensiones (fila, columna) a 3 dimensiones
(fila, columna, fila de tipos). Evidentemente se puede tener varios niveles de
tablas anidadas
Ver el grfico con las distintas rdenes para insertar, seleccionar, borrar,
sustituir, ...

Lo ms til es
1. Crear un tipo objeto con sus atributos
2. Crear un tipo tabla con el objeto anterior
3. Crear una tabla con un campo que sea una tabla anidada del objeto creado
en el punto 2
Ejemplo: queremos almacenar los siguientes datos de nuestros clientes:
Identificativo del cliente

Nombre
Telfono del cliente
Pero nos damos cuenta que un cliente tiene telfono personal de casa y mvil,
telfono de la empresa y mvil de la empresa, es decir, de 1 a 4 telefnos
1) Creamos un objeto del tipo telefono con 2 campos: tipo (casa, trabajo, fijo,
mvil, ...) y el numero
CREATE OR REPLACE TYPE TELEFONO AS OBJECT(tipo
varchar2(30),numero number)
2) Creamos un tipo tabla llamado listin que puede contener mltiples objetos del
tipo telfono
CREATE OR REPLACE TYPE LISTIN AS TABLE OF telefono;
3) Creamos una tabla con los datos de un cliente entre los que se encuentra un
campo del tipo listin

De esta forma, se crea una tabla en la que el campo TELFS es otra tabla con 2
campos: tipo y numero
A
N
PE
O
L
IM
TE
LI
DB
LS
D
R
O
E
S
1Fr Pe TIP
an rez O
ci
Casa
sc
Movi
o
l

Traba
jo

E
sp
2er
an
za

Ji TIP
me O
ne
Casa
z

Usamos las distintas rdenes SQL con la tabla ortriginal (cliente) y la tabla
anidada (tel_tab):
-- Inserto un cliente con 2 telefonos
INSERT INTO cliente (ID,nombre,apellidos,telfs) values
(1,'Francisco','Perez',listin(telefono('Casa',111),telefono('Movil',666)));
-- Inserto un cliente con 1 telefono
INSERT INTO cliente (ID,nombre,apellidos,telfs) values
(2,'Esperanza','Jimenez',listin(telefono('Casa',222)));
-- Aado un telefono al cliente 1. Ver el uso de la palabra clave TABLE que
recibe la tabla anidada
INSERT INTO TABLE (SELECT telfs FROM cliente WHERE id=1)
VALUES ('Trabajo',777);
-- Listado de clientes y sus telefonos (desanidamiento)
SELECT t1.nombre,t1.apellidos,t2.tipo,t2.numero FROM cliente
t1,TABLE(t1.telfs) t2;
-- Busqueda de un telefono concreto
SELECT t1.nombre,t1.apellidos,t2.tipo,t2.numero FROM cliente
t1,TABLE(t1.telfs) t2 WHERE t2.numero=777;
-- Telefonos de Perez
SELECT t2.tipo,t2.numero FROM cliente t1,TABLE(t1.telfs) t2 WHERE
t1.apellidos='Perez';
-- Cambio el telefono de casa de Perez
UPDATE TABLE (SELECT telfs FROM cliente WHERE apellidos='Perez')
SET numero=112 WHERE tipo='Casa';
-- Borro el telefono Movil de Perez
DELETE FROM TABLE (SELECT telfs FROM cliente WHERE
apellidos='Perez') WHERE tipo='Movil';

Você também pode gostar