objeto-relacional oracle 10g

51
M.I.T.I Ambrosio Cardoso Jiménez Enero 2010

Upload: benjamin

Post on 16-Jun-2015

5.473 views

Category:

Documents


4 download

DESCRIPTION

objeto relacional con oracle 10g, como crear un objeto, fucion y tablas

TRANSCRIPT

Page 1: Objeto-Relacional Oracle 10g

M.I.T.I Ambrosio Cardoso Jiménez

Enero 2010

Page 2: Objeto-Relacional Oracle 10g

Es una BD que permite que los datos sean grabadoscomo objetos. Sin embargo, todos los metadatos y lainformación siguen utilizando el sistema de filas ycolumnas de tal manera que la información puedaser accedida como en el modelo relacional. Asímismo, cuando los datos son recuperados de la Basede Datos se tiene la capacidad de reconstruirnuevamente los datos simples y transformarlos aobjetos complejos

Page 3: Objeto-Relacional Oracle 10g

Tipos estructurados de datos. No sólo se permiten atributos atómicos, sino

atributos construidos a partir de tipos atómicos y constructores tales como

struct, set, bag.

Operaciones especiales puedes ser definidas y aplicadas a valores de tipos

de datos definidos por el usuario.

Identificadores de tuplas. En bases de datos objeto-relacional, las tuplas

juegan el rol de objetos. Así pueden necesitar tener un identificador que las

distingue de otras tuplas, incluso para aquellas tuplas que tienen el mismo

valor en todos sus componentes. Este identificador puede ser invisible al

usuario.

Referencias. Permite referenciar o apuntar a otras tuplas.

Page 4: Objeto-Relacional Oracle 10g

Extensiones en los tipo de datosTipos Definidos por el UsuarioTipos fila y referenciaTipos colección (set, bag, list y array)Tipos de Objetos Grandes, LOB (LargeObjects)

Extensiones en el Control de la Semántica de datos Objeto-Relacionales:TriggersProcedimientos almacenados y funciones definidas por el Usuario

Extensiones en las capacidades Consultivas Objeto-Relacionales:Consultas recursivasSQL:99 Incorpora al lenguaje XML y viceversa

Otras Extensiones en las Bases de Datos Objeto-Relacionales:Extensiones a la ayuda en la toma de Decisiones: OLAP, etc.Intercambio de Objetos (OEM), Datos Multimedia, etc.

Page 5: Objeto-Relacional Oracle 10g

Introduce algunas características de XML, cambios en las funciones,estandarización del objeto sequence y de las columnas autonuméricasMultiset (Multiconjunto), Tabla anidada en Oracle 10g

Page 6: Objeto-Relacional Oracle 10g

UML SQL ORACLE 10g

DEFINE CLASS T_EmpleadoTYPE TUPLE [ nombres:string,direccion: string, telefono: string,fechaingreso: date]OPERATIONS antigüedad: integer

CREATE TYPE T_EmpleadoAS OBJECT (nombres VARCHAR2 (50),direccion VARCHAR2 (50), telefono VARCHAR2 (20),fechaingreso DATE , MEMBER FUNCTION antigüedad RETURN NUMBER, PRAGMA RESTRICT_REFERENCES (fechaingreso, WNDS));

T_Empleado

nombres: stringdireccion:stringtelefono: stringfechaIngreso: dateantigüedad(): int

WNDS: No se permite al método modificar las tablas de la base de datos

WNPS: No se permite al método modificar las variables del paquete PL/SQL

RNDS: No se permite al método leer las tablas de la base de datos

RNPS: No se permite al método leer las variables del paquete PL/SQL

Page 7: Objeto-Relacional Oracle 10g

Un tipo de dato define una estructura y un comportamiento común para unconjunto de datos de las aplicaciones. Los usuarios de Oracle pueden definir suspropios tipos de datos mediante dos categorías: tipos de objetos (object type) ytipos para colecciones (collection type). Para construir los tipos de usuario seutilizan los tipos básicos provistos por el sistema y otros tipos de usuariopreviamente definidos.

Un tipo de objeto representa una entidad del mundo real y se compone de los siguientes elementos: Su nombre que sirve para identificar el tipo de los objetos. Sus atributos que modelan la estructura y los valores de los datos de ese tipo. Cada atributo puede ser de un tipo de datos básico o de un tipo de usuario. Sus métodos (procedimientos o funciones) escritos en lenguaje PL/SQL (almacenados en la BDOR), o escritos en C (almacenados externamente).

Page 8: Objeto-Relacional Oracle 10g

CREATE TYPE tipo AS OBJECT ( c1 tipoDato, c2 tipoDato, … cn tipoDato,MEMBER FUNCTION f1 RETURN tipoDato[,PRAGMA RESTRICT_REFERENCES (campoX, FORMA)] );

La implementación del método se hace por separado

Page 9: Objeto-Relacional Oracle 10g

La especificación de un método se hace junto a la creación de su tipo, y debellevar siempre asociada una directiva de compilación (PRAGMARESTRICT_REFERENCES), para evitar que los métodos manipulen la base dedatos o las variables del paquete PL/SQL. Tienen el siguiente significado:

WNDS: no se permite al método modificar las tablas de la base de datosWNPS: no se permite al método modificar las variables del paquete PL/SQLRNDS: no se permite al método leer las tablas de la base de datosRNPS: no se permite al método leer las variables del paquete PL/SQL

Los métodos se pueden ejecutar sobre los objetos de su mismo tipo. Si x esuna variable PL/SQL que almacena objetos del tipo Empleado, entoncesx.antigüedad() calcula la antigüedad del Empleado almacenado en x. Ladefinición del cuerpo de un método en PL/SQL se hace de la siguiente manera:

Page 10: Objeto-Relacional Oracle 10g

CREATE OR REPLACE TYPE BODY T_Empleado AS

MEMBER FUNCTION antigüedad RETURN NUMBER IS BEGIN

RETURN ROUND ( SYSDATE-fechaIngreso ); /* regresa en dias */END;

END;

Page 11: Objeto-Relacional Oracle 10g

En Oracle, todos los tipos de objetos tienen asociado pordefecto un método que construye nuevos objetos de esetipo de acuerdo a la especificación del tipo. El nombre delmétodo coincide con el nombre del tipo, y sus parámetrosson los atributos del tipo.

Vamos a realizar una ligera modifcación a nuestra claseT_Empleado haciendo que direccion sea un TDU un lugarde un VARCHAR

Page 12: Objeto-Relacional Oracle 10g

Creamos un objeto con la estructura de una dirección

CREATE OR REPLACE TYPE t_Direccion AS OBJECT (calle VARCHAR2 (50), numero NUMBER, colonia VARCHAR2 (50),Estado VARCHAR (50), pais VARCHAR (50));

Modificamos el tipo T_Empleado

CREATE OR REPLACE TYPE T_EmpleadoAS OBJECT (nombres VARCHAR2 (50), direccion t_Direccion, telefono VARCHAR2 (20));

Page 13: Objeto-Relacional Oracle 10g

CREATE TABLE Empleado OF T_Empleado;

INSERT INTO Empleado VALUES (‘Juan Jimenez’,T_Direccion (‘Benito Juarez’, 121, ‘Las Ámericas’, ‘Oaxaca’,’México’), ‘9514567890’,’[email protected]’);

Page 14: Objeto-Relacional Oracle 10g

Una vez definidos los tipos, éstos pueden utilizarse para definirnuevos tipos, tablas que almacenen objetos de esos tipos, opara definir el tipo de los atributos de una tabla. Una tabla deobjetos es una clase especial de tabla que almacena un objetoen cada fila y que facilita el acceso a los atributos de esosobjetos como si fueran columnas de la tabla. Por ejemplo, sepuede definir una tabla para almacenar los Alumnos egresadosy otra para almacenar los que están inscritos actualmente enalgún semestre de la siguiente manera:

Page 15: Objeto-Relacional Oracle 10g

DROP TYPE t_Alumno FORCE;CREATE TYPE t_Alumno AS OBJECT (nocontrol VARCHAR (10), nombre VARCHAR (50), apellidos VARCHAR (50),carrera VARCHAR (50), semestreActual NUMBER );

1. CREATE TABLE alumnos OF t_Alumno (PRIMARY KEY (nocontrol) );

2. CREATE TABLE egresados (anioEgreso NUMBER, alumno t_Alumno );

La diferencia entre la primera y la segunda tabla es que la primeraalmacena objetos con su propia identidad (OID) y la segunda no es unatabla de objetos, sino una tabla con una columna con un tipo de datosde objeto. Es decir, la segunda tabla tiene una columna con un tipo dedatos complejo pero sin identidad de objeto. Además de esto, Oraclepermite considerar una tabla de objetos desde dos puntos de vista:Como una tabla con una sola columna cuyo tipo es el de un tipo deobjetos.Como una tabla que tiene tantas columnas como atributos de losobjetos que almacena.

Page 16: Objeto-Relacional Oracle 10g

La clave externa del modelo relacional expresa asociaciones uno-a-varios con la clave primaria. El modelo de objetos de Oracleproporciona una forma más eficaz para expresar asociaciones uno-a-varios. Oracle asigna un identificador único a cada objeto en una filallamado OID. El OID hace posible que otros objetos referencienobjetos filas existentes en la BD. Oracle guarda estas referencias en eltipo de dato llamado REF.Un atributo de tipo REF almacena una referencia a un objeto del tipodefinido, e implementa una relación de asociación entre los dos tiposde objetos. Estas referencias se pueden utilizar para acceder a losobjetos referenciados y para modificarlos; sin embargo, no es posibleoperar sobre ellas directamente. Para asignar o actualizar unareferencia se debe utilizar siempre REF o NULL.

Page 17: Objeto-Relacional Oracle 10g

T_Empleado

nombres: stringdireccion:stringtelefono: stringfechaIngreso: date

T_Nomina

fechaPago: DatePeriodo: stringempleado: T_EMPLEADOimporte: NUMBER (10,2)

Genera

0..*1

DROP TYPE t_Empleado FORCE;CREATE OR REPLACE TYPE t_Empleado AS OBJECT (nombres VARCHAR2 (50), direccion VARCHAR2 (50), telefono VARCHAR2 (20), fechaIngreso DATE );

DROP TABLE empleados;CREATE TABLE empleados OF t_Empleado;

CREATE TYPE t_Nomina AS OBJECT (fechaPago DATE, periodo VARCHAR2 (30),Empleado REF t_Empleado SCOPE IS empleados, importe NUMBER (10,2) );

CREATE TABLE nomina OF t_Nomina ;

Para la integridad referencial

Page 18: Objeto-Relacional Oracle 10g

INSERT INTO empleados VALUES ('Ambrosio Cardoso','Laureles121','9515706918','30/08/2009');

INSERT INTO empleados VALUES ('Gisela Vásquez','Buena Vista 102','95189456’,'01/01/2000');

INSERT INTO nomina (fechapago, periodo, Empleado, importe) SELECT '30/11/2009','15/11/2009-30/11/2009', REF (E), 3200FROM Empleados E WHERE nombres='Ambrosio Cardoso‘;

INSERT INTO nomina (fechapago, periodo, Empleado, importe) SELECT '30/12/2008','15/12/2008-30/12/2008', REF (E), 6200 FROM Empleados E WHERE nombres='Gisela Vásquez‘;

Page 19: Objeto-Relacional Oracle 10g

fechaPago Periodo Empleado Importe

30/11/09 15/11/2009-30/11/2009

0000220208FC5E867B31A841D3827BC350C07AC28470401219E57C4740B27616E8D7AE5B52

3200

30/12/08 15/12/2008-30/12/2008

000022020860F0C29AA39D4B0C9F130A46C9E426B170401219E57C4740B27616E8D7AE5B52

6200

SELECT * FROM nomina;

Como se ha comentado anteriormente, en el campo Empleado, se almacena el OID(identificador de objeto) que está en la tabla empleados. Para poder ver el contenido deeste campo, ORACLE dispone de una función DEREF esta función toma el OID, evalúa lareferencia y devuelve un valor.

Page 20: Objeto-Relacional Oracle 10g

SELECT DEREF (n.Empleado), fechaPago, importe FROM nomina n;

Empleado fechaPago Importe

T_EMPLEADO('Ambrosio Cardoso', 'Laureles 121', '9515706918', '30/08/09')

30/11/09 3200

T_EMPLEADO('Gisela Vásquez', 'Buena Vista 102', '95189456', '01/01/00')

30/12/08 6200

Page 21: Objeto-Relacional Oracle 10g

Un array es un conjunto ordenado de elementos del mismo tipo. Cadaelemento tiene asociado un índice que indica su posición dentro del array.Oracle permite que los VARRAY sean de longitud variable, aunque esnecesario especificar un tamaño máximo cuando se declara el tipo VARRAY.Las siguientes declaraciones crean un tipo para una lista ordenada dehabilidades

CREATE TYPE t_Habilidades AS VARRAY (5) OF VARCHAR2 (50) ;

Cuando se declara un tipo VARRAY no se reserva espacio. Si el espacio querequiere lo permite, se almacena junto con el resto de columnas de su tabla,pero si es demasiado largo (más de 4000 bytes) se almacena aparte de latabla como un BLOB.

Page 22: Objeto-Relacional Oracle 10g

define TYPE t_Habilidades LIST (string);

CREATE TYPE t_Habilidades AS VARRAY (5) OF VARCHAR2(50) ;

DEFINE CLASS T_Gente : tuple [nombre:string,apellidos: string, habilidad t_Habilidades];

CREATE TYPE T_Gente AS OBJECT(nombre VARCHAR2 (50), apellidos VARCHAR2 (50), habilidad t_Habilidades ) ;

CREATE TABLE gente OF T_Gente;

INSERT INTO gente VALUES (‘Rosa Maria’,’Perez’, t_Habilidades(‘Música’,’Ajedrez’,’Futbol’,’Natación’) );

Page 23: Objeto-Relacional Oracle 10g
Page 24: Objeto-Relacional Oracle 10g

T_Persona

nombres: stringdireccion:stringtelefono: stringcurp: stringsexo: string

T_Profesor

cedula: stringnivelAcademico:stringespecialidad: stringsueldo: float

T_Alumno

nocontrol: stringcarrera:stringsemestre: Intgrupo: string

DROP TYPE t_Persona FORCE;CREATE TYPE t_Persona AS OBJECT (nombres VARCHAR2 (50),direccion VARCHAR2 (50),telefono VARCHAR2 (20),curp VARCHAR2 (18),sexo CHAR (1) ) NOT FINAL ;DROP TYPE t_Profesor FORCE;CREATE TYPE t_ProfesorUNDER t_Persona (cedula VARCHAR2 (10), nivelAcademico VARCHAR2 (50),especialidad VARCHAR2 (50),Sueldo NUMBER (10,2)) ;DROP TYPE t_Alumno FORCE;CREATE TYPE t_AlumnoUNDER t_Persona (nocontrol VARCHAR2 (10),carrera VARCHAR2 (50),semestre NUMBER,grupo CHAR (1) );

Page 25: Objeto-Relacional Oracle 10g

CREATE TABLE Persona OF t_Persona;

INSERT INTO Persona VALUES (‘Ambrosio Cardoso’, ‘Laureles 121’,’9515706918’,’CAJA751207HOCRMM06’,’M’);

INSERT INTO Persona VALUES ( t_Persona(‘Angela Mendez’,‘Benito Juarez 121’,’9515123456’,’MERA781209HTCRMM09’,’F’) );

T_Persona

nombres: stringdireccion:stringtelefono: stringcurp: stringsexo: string

T_Profesor

cedula: stringnivelAcademico:stringespecialidad: stringsueldo: float

T_Alumno

nocontrol: stringcarrera:stringsemestre: Intgrupo: string

Page 26: Objeto-Relacional Oracle 10g

INSERT INTO persona VALUES (

T_Profesor (‘Pablo Munguia’, ‘Alamos11’,’9515123456’,’MUGP600303HOCRMM06’,’M’,’99999’,’Maestria’,’Tec. Informacion’,10000.00 ));

INSERT INTO persona VALUES (

T_Alumno (‘Wilches Ramiro’, ‘Emiliano Zapata 66’,’95151654321’,’AMWL800303HACRXX86’,’M’,’68456’,’Maestria en Tec. Informacion’,5,’U’ ));

T_Persona

nombres: stringdireccion:stringtelefono: stringcurp: stringsexo: string

T_Profesor

cedula: stringnivelAcademico:stringespecialidad: stringsueldo: float

T_Alumno

nocontrol: stringcarrera:stringsemestre: Intgrupo: string

NOTA:

En Oracle los subtiposno pueden ser

solapados.

Page 27: Objeto-Relacional Oracle 10g

Primera Forma

SQL> select * from persona;

NOMBRES DIRECION TELEFONO CURP SEXOAmbrosio cardoso Laureles 121 9515706918 CAJA751207HOCRMM06 MAngela Mendez Benito Juarez 121 9515123456 MERA781209HTCRMM09 FPablo Munguia Alamos 11 9515123456 MUGP600303HOCRMM06 MWilches Ramiro Emiliano Zapata 66 95151654321 AMWL800303HACRXX86 M

Page 28: Objeto-Relacional Oracle 10g

Segunda Forma

SQL> select value (p) from Persona P;

VALUE(P)(NOMBRES, DIRECCION, TELEFONO, CURP, SEXO)--------------------------------------------------------------------------------T_PERSONA('Ambrosio cardoso', 'Laureles 121', '9515706918', 'CAJA751207HOCRMM06', 'M')

T_PERSONA('Angela Mendez', 'Benito Juarez 121', '9515123456', 'MERA781209HTCRMM09', 'F')

T_PROFESOR('Pablo Munguia', 'Alamos 11', '9515123456', 'MUGP600303HOCRMM06', 'M', '99999','Maestria', 'Tec.Informacion', 10000)

T_ALUMNO('Wilches Ramiro', 'Emiliano Zapata 66', '95151654321', 'AMWL800303HACRXX86', 'M', '68456', 'Maestria en Tec. Informacion', 5, 'U')

La función VALUE sirve para obtener la misma estructura del tipo de objeto de un objeto tabla

Page 29: Objeto-Relacional Oracle 10g

SELECT VALUE (p) FROM persona p WHERE VALUE (p) IS OF (ONLY t_Alumno);

VALUE(P)(NOMBRES, DIRECCION, TELEFONO, CURP, SEXO)--------------------------------------------------------------------------------

T_ALUMNO('Wilches Ramiro', 'Emiliano Zapata 66', '95151654321', 'AMWL800303HACRXX86', 'M', '68456', 'Maestria en Tec. Informacion', 5, 'U')

Page 30: Objeto-Relacional Oracle 10g

1. Insertar 2 objetos de Profesor y 2 para alumnos (tanto Masculino como Femenino <<M,F>>)

2. Mostrar únicamente cedula y nivelAcademicode los profesores

3. Mostrar nombres, nivelAcademico y sueldos de los profesores

4. Mostrar alumnos de sexo Femenino (F)

Page 31: Objeto-Relacional Oracle 10g

2 SELECT TREAT (VALUE (P) AS T_Profesor ).cedula,TREAT (VALUE (P) AS T_Profesor ).nivelAcademicoFROM persona p;

3SELECT nombres, TREAT (VALUE (P) AS T_Profesor).nivelAcademico,TREAT (VALUE (P) AS T_Profesor ).sueldoFROM persona p WHERE VALUE (p) IS OF (ONLY t_Profesor);

TREAT Permite descubrir los atributos propios de un tipoDevuelve nulo si el objeto no se

puede convertir

Tampoco convierte un subtipo a

supertipo

Page 32: Objeto-Relacional Oracle 10g

4 SELECT VALUE (P) FROM persona p WHERE VALUE (p) IS OF (ONLYt_Alumno) AND sexo='F';

Adicionalmente pruebe estas instrucciones y comente los resultados

SELECT TREAT(VALUE(p) AS T_Profesor) FROM persona p;

Page 33: Objeto-Relacional Oracle 10g

UPDATE persona SET nombres='Ambrosio Cardoso Jiménez' WHERE nombres='Ambrosio cardoso';

UPDATE persona PSET VALUE(P) = T_ALUMNO('Wilches Ramiro Amado Miguel', 'Emiliano Zapata 66', '95151654321', 'AMWL800303HACRXX86', 'M', '68456', 'Maestria en Tec. Informacion', 5, ‘U') WHERE TREAT(VALUE(P) AS T_Alumno).nocontrol = '68456';

Page 34: Objeto-Relacional Oracle 10g

DELETE FROM persona p WHERE TREAT(VALUE(P) AS t_Alumno).nocontrol ='68456';

Page 35: Objeto-Relacional Oracle 10g
Page 36: Objeto-Relacional Oracle 10g

Primero se debe definir el tipo de la tabla anidada que desea crearEl tipo de datos de la tabla anidada puede estar basado en un tipo de datos: PrimitivoDefinido por el usuario (típicamente) Incluso en el de otra tabla anidada (tablas anidadas de tablas anidadas, etc.)

Cada tabla anidada puede contener un número ilimitado de filasSon una alternativa para eliminar relaciones 1 a muchos haciendo en algunos casos más natural el diseño

Page 37: Objeto-Relacional Oracle 10g

T_Pedido

idPedido: intfecha: dateproveedor : string

T_DetallePedido

articulo: stringcantidad: intprecio : double

1..*

T_Pedido

idPedido: intfecha: dateproveedor : string<<multiset>> detalle: {T_DetallePedido}

T_DetallePedido

articulo: stringcantidad: intprecio : double

UML

SQL

Page 38: Objeto-Relacional Oracle 10g

CREATE TYPE t_Detallepedidos AS OBJECT (articulo VARCHAR2 (50), cantidad NUMBER, precio NUMBER (10,2));

CREATE OR REPLACE TYPE detalle AS TABLE OF t_Detallepedidos;

CREATE TYPE t_Pedidos AS OBJECT (idPedido number (10),fecha DATE, proveedor VARCHAR2 (50), detallepedidos detalle);

CREATE TABLE pedidos OF t_Pedidos (PRIMARY KEY (idpedido)) NESTED TABLE detallepedidos STORE AS tbl_DP;

T_Pedido

idPedido: intfecha: dateproveedor : string<<multiset>> detalle: {T_DetallePedido}

T_DetallePedido

articulo: stringcantidad: intprecio : double

Oracle 10g

Page 39: Objeto-Relacional Oracle 10g

CREATE TYPE t_Pedidos AS OBJECT (idPedido number (10),fecha DATE, proveedor VARCHAR2 (50), detallepedidos detalle);

CREATE TABLE pedidos OF t_Pedidos (PRIMARY KEY (idpedido)) NESTED TABLE detallepedidos STORE AS tbl_DP;

detallepedidos es el nombre de la columna y contiene para cada orden su tabla anidada de detalle.tbl_DP es el nombre físico del lugar (tabla) donde se almacenan todas las tablas anidadas de la columna detalle.Esta tabla no se puede accesar directamente, sólo a través de la columna detalle. Directamente es “intocable”, sólo se puede describir

Page 40: Objeto-Relacional Oracle 10g

INSERT INTO pedidos VALUES (1,to_date('01/11/2009'),'Proveedora escolar',detalle ( t_detallePedidos ('C# avanzado',1,1234),

t_detallePedidos ('Oracle 10g Expert',2,790),t_detallePedidos ('ASP.NET paso apaso',1,99)) );

INSERT INTO pedidos VALUES (2,to_date('10/11/2009'),'LA balanza',detalle ( t_detallePedidos ('Resistol 850',4,45),

t_detallePedidos ('Borrador',1,15)) );

Page 41: Objeto-Relacional Oracle 10g

idPedido fecha proveedor Detalle

1 01/11/2009 Proveedora escolar

2 10/11/2009 La Balanza

… … … …

Articulo cantidad precio

C# avanzado 1 1234

Oracle 10 g Expert 2 790

ASP.NET paso a paso 1 999

Articulo cantidad precio

Resistol 870 4 45

Borrador 1 15

Page 42: Objeto-Relacional Oracle 10g

Mostrar todos los pedidos con sus detallesSELECT * FROM pedidos;

Mostrar los idpedido con sus detallesSELECT idpedido, detallepedidos from pedidos;

¿Qué pasa si se desea imprimir el idpedido sólo con el artículo de sus detalles?. ¡Inténtelo!

Page 43: Objeto-Relacional Oracle 10g

Para agregar más detalles a la orden # 2, se requiere usar el operador THE, para acceder a la tabla anidada así:

INSERT INTO THE (SELECT detallepedidos FROM

pedidos WHERE idpedido=2) VALUES (‘Sacapuntas eléctrico‘,1,145);

Nota: THE debe recibir como parámetro una sola tabla anidada.

Page 44: Objeto-Relacional Oracle 10g

También se puede usar el operador TABLE:

INSERT INTO TABLE (SELECT detallepedidos FROM

pedidos WHERE idpedido=1) VALUES (‘POO‘,1,845);

¿Diferencias entre THE y TABLE?

Page 45: Objeto-Relacional Oracle 10g

Considere lo siguiente:

INSERT INTO pedidos VALUES(3,SYSDATE,’Editorial trillas’,NULL);

Intentamos agregar los elementos

INSERT INTO THE (SELECT detallepedidos FROM pedidos WHERE idpedido=3) VALUES(‘Oaxaca en pie de lucha’,1,322);Genera el error: ORA-22908: reference to NULL tablevalue. ¿Entonces cómo llenarla?

Tabla anidada

nula

Page 46: Objeto-Relacional Oracle 10g

Lo que se debe hacer es un update de la siguiente manera:

UPDATE pedidos SET detallepedidos =

detalle ( t_detallePedidos (‘Oaxaca en pie de

lucha’,1,322) )WHERE idpedido = 3;

Page 47: Objeto-Relacional Oracle 10g

Sumar 1 unidad a la cantidad del idpedido 3.

UPDATE THE(SELECT detallepedidos FROM pedidos WHERE idpedido = 3) anidadaSET anidada.cantidad=anidada.cantidad + 1WHERE anidada.articulo = ‘Oaxaca en pie de lucha’;

Agregar un articulo temporal a idpedido 3

Borrar el articulo temporal de idpedido 3

DELETE FROM THE(SELECT detallepedidos FROM pedidos WHERE idpedido=3)WHERE articulo=‘Temporal’;

Page 48: Objeto-Relacional Oracle 10g

Selección de columnas de la tabla anidada con columnas de la tabla que la contiene:

SELECT p.idpedido, dp.articuloFROM pedidos p, TABLE(p.detallepedidos) dp;

Curiosamente aquí NO es válido el uso de THE:

SELECT p.idpedido, dp.articuloFROM pedidos p, THE (p.detallepedidos) dp;

Page 49: Objeto-Relacional Oracle 10g
Page 50: Objeto-Relacional Oracle 10g

Diagrama UML para una Aplicación de facturación Francisco Charte Ojeda 2007

Page 51: Objeto-Relacional Oracle 10g