La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

01/12/07Seminario de Bases de Datos1 Características Objeto Relacionales en Oracle 10G* * Tomado del curso de Francisco Moreno.

Presentaciones similares


Presentación del tema: "01/12/07Seminario de Bases de Datos1 Características Objeto Relacionales en Oracle 10G* * Tomado del curso de Francisco Moreno."— Transcripción de la presentación:

1 01/12/07Seminario de Bases de Datos1 Características Objeto Relacionales en Oracle 10G* * Tomado del curso de Francisco Moreno

2 01/12/07Seminario de Bases de Datos2 Colecciones Las colecciones en Oracle son de 2 Tipos: Tablas Anidadas (Nested Tables) Varrays (Variable Arrays )

3 01/12/07Seminario de Bases de Datos3 Tablas Anidadas La intersección de una fila y una columna puede contener una tabla ¿Violación a la primera forma normal? Álgebra y Cálculo para este tipo de relaciones en: Roth, M.A.; Korth, H.F.; Silberschatz, A. "Extended Algebra and Calculus for ~1NF Relational Databases, Reporte Técnico TR.85.19, Universidad de Texas, Austin, 1985.

4 01/12/07Seminario de Bases de Datos4 tipo Primero se debe definir el tipo de la tabla anidada que desea crear El tipo de datos de la tabla anidada puede estar basado en un tipo de datos: - Primitivo - Definido por el usuario (típicamente) - Incluso en el de otra tabla anidada (tablas anidadas de tablas anidadas etc.)

5 01/12/07Seminario de Bases de Datos5 Cada tabla anidada puede contener un número ilimitado de filas Son una alternativa para eliminar relaciones 1 a muchos haciendo en algunos casos más natural el diseño El lenguaje para su manipulación puede resultar complejo

6 01/12/07Seminario de Bases de Datos6 Ejemplo Modelo Entidad Relación ORDEN # id_orden *fecha DETALLE #id_producto *cantidad en compuesta de Nota: La relación de orden a detalle podría ser obligatoria… Veamos algunas alternativas para implementar este modelo

7 01/12/07Seminario de Bases de Datos7 Relacional Relacional: 2 tablas y manejo de clave foránea ORDEN # id_orden *fecha DETALLE#id_producto #Id_orden () #Id_orden (cf)*cantidad Objeto relacionalPrimera forma cons Objeto relacional: Primera forma con REFs: -Crear los tipos para ORDEN y para DETALLE -Crear las tablas tipadas correspondientes -En el tipo DETALLE el atributo id_orden en vez de ser una clave foránea, se convierte en un REF que apunta hacia una tabla tipada de órdenes

8 01/12/07Seminario de Bases de Datos8 Objeto relacionalSegunda forma con tablas anidadas Objeto relacional: Segunda forma con tablas anidadas Se crea un tipo tabla anidada para manejar los detalles Se crea una tabla clásica para manejar las órdenes con columnas: - id_orden - fecha - detalles: La cual será una tabla anidada de detalles, donde cada detalle consta de - id_producto - cantidad

9 01/12/07Seminario de Bases de Datos9 Gráficamente: Junio 23 de 2002 78 Vacía Mayo 2 de 2003 34 Julio 13 de 2003 11detallesfechaid_orden 1001 902cantidadid_producto Órdenes Tabla de Órdenes 1501cantidadid_producto

10 01/12/07Seminario de Bases de Datos10 Se crea normalmente 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)); /

11 01/12/07Seminario de Bases de Datos11 Se crea el tipo de la tabla anidada basada en el tipo detalle_tip : CREATE OR REPLACE TYPE nest_detalle nest_detalle AS TABLE OF detalle_tip; / Un tipo de tabla anidada puede estar basado en un tipo primitivo, por ejemplo: CREATE OR REPLACE TYPE hobbies AS TABLE OF VARCHAR2(10); /

12 01/12/07Seminario de Bases de Datos12 nest_detalle Ahora ya es posible declarar la columna detalles de tipo nest_detalle (tabla anidada de detalles): DROP TABLE orden PURGE; CREATE TABLE orden ( id_orden NUMBER(3) PRIMARY KEY, fecha DATE NOT NULL, detalles nest_detalle detalles nest_detalle) NESTED TABLE detalles STORE AS store_detalles NESTED TABLE detalles STORE AS store_detalles; ¿Qué significa?

13 01/12/07Seminario de Bases de Datos13 detalles detalles es el nombre de la columna y contiene para cada orden su tabla anidada de detalles. store_detalles todas store_detalles es el nombre físico del lugar (tabla) donde se almacenan todas las tablas anidadas de la columna detalles. detalles Esta tabla no se puede accesar directamente*, sólo a través de la columna detalles. Directamente es intocable, sólo se puede describir… * Aunque existe un HINT, que no se verá acá, que permite hacerlo…

14 01/12/07Seminario de Bases de Datos14 Inserción 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), detalle_tip(13,220)) );

15 01/12/07Seminario de Bases de Datos15 Selección: La selección es normal: SELECT * FROM orden; --Imprime cada orden acompañada de todos sus items… SELECT detalles, id_orden FROM orden; --Imprime el código de cada orden y sus detalles… ¿Qué pasa si se desea imprimir el código de cada orden sólo con el código de los productos de sus detalles? Ver más adelante

16 01/12/07Seminario de Bases de Datos16 Para agregar más detalles a la orden # 100, se requiere usar el operador TABLE, para acceder a la tabla anidada así: TABLE INSERT INTO TABLE (SELECT detalles FROM orden WHERE id_orden=100) VALUES(31,330); INSERT INTO TABLE (SELECT detalles FROM orden WHERE id_orden=200) VALUES(32,30);

17 01/12/07Seminario de Bases de Datos17 Considérese lo siguiente: DELETE orden; INSERT INTO orden VALUES(111,SYSDATE,NULL); --Y ahora: INSERT INTO TABLE (SELECT detalles FROM orden WHERE id_orden=111) VALUES(10,22); --Genera el error: ORA-22908: reference to NULL table value ¿Entonces cómo llenarla? Tabla anidada nula

18 01/12/07Seminario de Bases de Datos18 Lo que se debe hacer es un update de la siguiente manera: UPDATE orden SET detalles = nest_detalle ( detalle_tip(10,1000), detalle_tip(11,1100), detalle_tip(12,1200)) WHERE id_orden = 111;

19 01/12/07Seminario de Bases de Datos19 Supóngase que se realiza lo siguiente: DELETE FROM TABLE(SELECT detalles FROM orden WHERE id_orden=111); Para insertar los detalles de la orden 111, se puede proceder* así: INSERT INTO TABLE (SELECT detalles FROM orden WHERE id_orden=111) VALUES(10,2000); Conclusión: Tabla anidada átomicamente nula Tabla anidada vacía * En este caso el UPDATE también funciona

20 01/12/07Seminario de Bases de Datos20 Sumar 5 unidades a la cantidad de la orden 111 en su item 10: UPDATE TABLE(SELECT detalles FROM orden WHERE id_orden=111) anidada SET anidada.cantidad=anidada.cantidad + 5 WHERE anidada.id_producto = 10; El alias es opcional… Borrar el item 10 a la orden 111: DELETE FROM TABLE(SELECT detalles FROM orden WHERE id_orden=111) WHERE id_producto=10;

21 01/12/07Seminario de Bases de Datos21 Selección de columnas de la tabla anidada con columnas de la tabla que la contiene: SELECT id_orden, t2.id_producto FROM orden t, TABLE(t.detalles) t2; Desanidamiento

22 01/12/07Seminario de Bases de Datos22 Star#name*age Planet Planet #name *mass gobernando a orbitando a Satellite#name*diameter orbitando a gobernando a

23 01/12/07Seminario de Bases de Datos23 DROP TYPE satellite_t FORCE; CREATE OR REPLACE TYPE satellite_t AS OBJECT ( name VARCHAR2(20), diameter NUMBER(10)); / DROP TYPE nt_sat_t FORCE; CREATE TYPE nt_sat_t AS TABLE OF satellite_t; /

24 01/12/07Seminario de Bases de Datos24 DROP TYPE planet_t FORCE; CREATE OR REPLACE TYPE planet_t AS OBJECT ( name VARCHAR2(20), mass NUMBER(10), satellites nt_sat_t); / DROP TYPE nt_pl_t FORCE; CREATE TYPE nt_pl_t AS TABLE OF planet_t; /

25 01/12/07Seminario de Bases de Datos25 DROP TABLE star PURGE; CREATE TABLE star( name VARCHAR2(20), age NUMBER(10), planets nt_pl_t) NESTED TABLE planets STORE AS planets_tab (NESTED TABLE satellites STORE AS satellites_tab);

26 01/12/07Seminario de Bases de Datos26 INSERT INTO star VALUES ('Sun',23,nt_pl_t( planet_t('Neptune',10, nt_sat_t( satellite_t('Proteus',67), satellite_t('Triton',82) ) ), planet_t('Jupiter',189, nt_sat_t( satellite_t('Callisto',97), satellite_t('Ganymede', 22) ) ); ¿Qué implicaciones tendría manejar una entidad llamada cuerpo_celeste y manejar subtipos?

27 01/12/07Seminario de Bases de Datos27 SELECT s.name sn, p.name pn,t.name tn FROM star s, TABLE(s.planets) p, TABLE(p.satellites) t; SN PN TN ------- ------------ --------------- Sun Neptune Proteus Sun Neptune Triton Sun Jupiter Callisto Sun Jupiter Ganymede


Descargar ppt "01/12/07Seminario de Bases de Datos1 Características Objeto Relacionales en Oracle 10G* * Tomado del curso de Francisco Moreno."

Presentaciones similares


Anuncios Google