Escolar Documentos
Profissional Documentos
Cultura Documentos
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;
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) ;
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';