You are on page 1of 25

Caractersticas

Objeto Relacionales
en Oracle
Francisco Moreno
Universidad Nacional

Colecciones
Las colecciones en Oracle pueden ser:

Tablas Anidadas (Nested Tables)

Varrays (Variable Arrays)

Tablas Anidadas

La interseccin de una fila y una columna


puede contener una tabla
lgebra y clculo para este tipo de
relaciones en:
Roth, M.A.; Korth, H.F.; Silberschatz, A.
"Extended Algebra and Calculus for ~1NF
Relational Databases, Informe Tcnico
TR.84.36, Universidad de Texas, Austin,
1985.

Para crear una tabla anidada, primero


se debe definir su tipo
El tipo de la tabla anidada se puede
basar en un tipo de datos:
- Primitivo.
- Definido por el usuario. Puede ser
incluso el de otra tabla anidada
(tablas anidadas de tablas anidadas,
etc.)

Una tabla anidada puede tener un


nmero ilimitado de filas
Es una alternativa para eliminar
relaciones uno a muchos haciendo en
algunos casos el diseo ms natural
pero tambin puede llevar a diseos
complejos
El lenguaje para su manipulacin
puede resultar complejo

Ejemplo
Modelo Entidad Relacin

ORDEN
# id_orden
* fecha

compuesta
de
en

DETALLE
# id_producto
* cantidad

A continuacin se implementa este modelo con una


tabla anidada
Nota: La relacin de orden a detalle debera ser obligatoria; sin embargo, se suele
poner opcional para facilitar la implementacin.

Grficamente:
id_orden
100

fecha

detalles

Marzo 10 de 2016

34

Marzo 9 de 2016

200

Marzo 9 de 2016

id_producto

cantidad

10

1000

11

900

17

200

Vaca
id_producto

cantidad

10

2000

1000

Tabla ORDEN

Se crea el tipo para los detalles:


DROP TYPE detalle_tip FORCE;
CREATE OR REPLACE TYPE detalle_tip
AS OBJECT(
id_producto NUMBER(3),
cantidad NUMBER(10));
/

Se crea el tipo de la tabla anidada basada en


el tipo detalle_tip:

CREATE OR REPLACE TYPE


nest_detalle AS TABLE OF detalle_tip;
/

Se crea el tipo para la tabla tipada:

CREATE TYPE orden_type AS OBJECT(


id_orden NUMBER(3),
fecha DATE,
detalles nest_detalle);
/

Se crea la tabla tipada:

DROP TABLE orden;


CREATE TABLE orden OF orden_type
(id_orden PRIMARY KEY)
NESTED TABLE detalles STORE AS store_detalles;
store_detalles
Qu significa?

detalles es el nombre de la columna y


contiene para cada orden su tabla anidada
de detalles.
store_detalles es el nombre de una tabla
donde se almacenan todas las tablas
anidadas de la columna detalles.
Esta tabla no se debe acceder
directamente*, solo a travs de la columna
detalles.
detalles

* Existe un hint, que no se ver ac, que permite hacerlo

Tabla donde se almacenan


las filas de todas las tablas
anidadas.
El campo NESTED_TABLE_ID
establece la conexin entre
las dos tablas

El modelo ER dado indica que se debe controlar


que no haya productos repetidos en cada orden:

DROP TABLE orden;


CREATE TABLE orden OF orden_type
(id_orden PRIMARY KEY)
NESTED TABLE detalles STORE AS store_detalles
((PRIMARY KEY(NESTED_TABLE_ID, id_producto)));

Otra opcin es hacer un trigger

Insercin de datos
INSERT INTO orden VALUES(100,SYSDATE,
nest_detalle(detalle_tip(10,1000),
detalle_tip(11,900),
detalle_tip(17,200))
);
INSERT INTO orden VALUES(200,SYSDATE-1,
nest_detalle(detalle_tip(10,2000),
detalle_tip(5,100))
);

Otro ejemplo
CREATE OR REPLACE TYPE
nest_docsXML AS TABLE OF XMLTYPE;
/
CREATE TABLE libro(
cod NUMBER(8) PRIMARY KEY,
titulo VARCHAR2(15) NOT NULL,
mis_caps nest_docsXML
)NESTED TABLE mis_caps STORE AS store_capitulos;

INSERT INTO libro VALUES


(54, 'Los Animales',
nest_docsXML(
XMLTYPE('<data><num>1</num><tit>Boa</tit>
<pags>12</pags></data>'),
XMLTYPE('<data><num>2</num><tit>Oso</tit>
<pags>18</pags></data>'),
XMLTYPE('<data><num>3</num><tit>Pez</tit>
<pags>20</pags></data>'))
);

INSERT INTO libro VALUES


(55, 'Clculo',
nest_docsXML(
XMLTYPE('<data><num>1</num><tit>Ecuaciones</tit>
<pags>25</pags></data>'),
XMLTYPE('<data><num>2</num><tit>Geometrias</tit>
<pags>10</pags></data>'),
XMLTYPE('<data><num>3</num><tit>Integrales</tit>
<pags>50</pags>3</data>'))
);

Continuando con la tabla


orden Seleccin:

SELECT *
FROM orden;

Imprimir el cdigo de cada orden acompaada


solo por el cdigo (id_producto) de los
productos de sus detalles:

Alias de la
tabla anidada

SELECT id_orden, t2.id_producto


FROM orden t, TABLE(t.detalles) t2;
Desanidamiento

SELECT id_orden, t2.id_producto, t2.nested_table_id


FROM orden t, TABLE(t.detalles) t2;
Ahora al desanidar a mis_caps:
SELECT l.cod, c.*
FROM libro l, TABLE(l.mis_caps) c;
De dnde surge la columna COLUMN_VALUE?

Por lo tanto, es posible:


SELECT l.cod, l.titulo,
SUBSTR(EXTRACTVALUE(c.column_value,'/data/num'),1,2)
AS num,
SUBSTR(EXTRACTVALUE(c.column_value,'/data/tit'),1,10)
AS tc
FROM libro l, TABLE(l.mis_caps) c;

Para agregar ms detalles a la orden 100:


INSERT INTO TABLE(SELECT detalles
FROM orden
WHERE id_orden = 100)
VALUES(31,330);

Nota: TABLE debe recibir como parmetro una


sola tabla anidada.

Borrar el detalle del pdto 10 en la orden 100:


DELETE FROM TABLE(SELECT detalles
FROM orden
WHERE id_orden = 100)
WHERE id_producto = 10;

Sumar 5 a la cantidad del pdto 11 en la orden 100:


UPDATE TABLE(SELECT detalles
FROM orden
WHERE id_orden = 100)
SET cantidad = cantidad + 5
WHERE id_producto = 11;

Una tabla anidada se puede recorrer as en PL/SQL:


DECLARE
mi_tab_anid nest_detalle; /*Se declara una variable de
tipo tabla anidada*/
BEGIN
SELECT detalles INTO mi_tab_anid
FROM orden
WHERE id_orden = 100;
--Se recorre como si fuese un array
FOR i IN 1.. mi_tab_anid.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(mi_tab_anid(i).id_producto
|| ':' || mi_tab_anid(i).cantidad);
END LOOP;
END;
Como siempre, se deben controlar
posibles excepciones
/

BEGIN
FOR mi_l IN (SELECT * FROM libro) LOOP
DBMS_OUTPUT.PUT_LINE(mi_l.titulo);
FOR i IN 1.. mi_l.mis_caps.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(mi_l.mis_caps(i).EXTRACT('/data
/tit').GETSTRINGVAL());
END LOOP;
END LOOP;
END;
/
Nota: la funcin
EXTRACTVALUE es una
funcin de SQL no de
PL/SQL

Ejercicio: intercambiar las tablas anidadas


de la orden 100 y de la orden 200, es
decir, la orden 100 queda con la tabla
anidada de la orden 200 y viceversa.
Imprimir el ttulo de los libros que tengan
un captulo que contenga la palabra
ecuaciones.

You might also like