DAW BD07 PDFContenidos
DAW BD07 PDFContenidos
DAW BD07 PDFContenidos
Caso práctico
Juan ha realizado un curso de
perfeccionamiento sobre programación
con bases de datos, y ha conocido las
ventajas que pueden ofrecer el uso de las
bases de datos objeto-relacionales. Hasta
ahora siempre había usado las bases de
datos relacionales, pero el conocimiento
de las bases de datos orientadas a
objetos le ha ofrecido nuevas perspectivas
para aprovechar de manera más óptima la reutilización de código, el
trabajo colaborativo, y la interconexión de las bases de datos con
otros lenguajes de programación orientados a objetos.
1 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Caso práctico
Ana ha sabido que Juan ha realizado el
curso de formación de bases de datos
objeto-relacionales, y éste se ha ofrecido a
compartir los conocimientos que ha
adquirido. Lo primero va a ser es que
conozca las características que tienen
estos tipos de bases de datos, para que
compruebe las diferencias que tienen
respecto a las bases de datos relaciones
que ha usado hasta ahora. Usarán la base de datos de Oracle que han
utilizado anteriormente, pero ahora van a darle el enfoque de este
nuevo tipo de bases de datos.
Las bases de datos objeto-relacionales que vas a conocer en esta unidad son las
referidas a aquellas que han evolucionado desde el modelo relacional tradicional a
un modelo híbrido que utiliza además la tecnología orientada a objetos. Las clases,
objetos, y herencia son directamente soportados en los esquemas de la base de
datos y el lenguaje de consulta y manipulación de datos. Además da soporte a una
extensión del modelo de datos con la creación personalizada de tipos de datos y
métodos.
Los tipos de objetos que vas a conocer, así como las características orientadas a
objeto, te van a proporcionar una mecanismo para organizar los datos y acceder
a ellos a alto nivel. Por debajo de la capa de objetos, los datos seguirán estando
almacenados en columnas y tablas, pero vas a poder trabajar con ellos de manera
más parecida a las entidades que puedes encontrar en la vida real, dando así más
significado a los datos. En vez de pensar en términos de columnas y tablas cuando
2 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Podrás utilizar las características orientadas a objetos que vas a aprender en esta
unidad a la vez que puedes seguir trabajando con los datos relacionalmente, o bien
puedes usar de manera más exclusiva las técnicas orientadas a objetos.
Las tablas de bases de datos relacionales sólo contienen datos. En cambio, los
objetos pueden incluir la posibilidad de realizar determinadas acciones sobre los
datos. Por ejemplo, un objeto "Compra" puede incluir un método para calcular el
importe de todos los elementos comprados. O un objeto "Cliente" puede tener
métodos que permitan obtener su historial de compras. De esta manera, una
aplicación tan sólo debe realizar una llamada a dichos métodos para obtener esa
información.
3 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Caso práctico
Juan comienza a explicarle a Ana uno de
los conceptos básicos en las bases de
datos orientadas a objetos. Se trata de los
tipos de datos objeto. Le hace ver que
cualquier objeto que manejamos a diario
se puede considerar un posible tipo de
objeto para una base de datos.
En el mundo real solemos pensar en un objeto, entidad, persona, animal, etc. como
un conjunto de propiedades y acciones. Por ejemplo, el alumnado tiene una serie
de propiedades como el nombre, fecha de nacimiento, DNI, curso, grupo,
calificaciones, nombre del padre y de la madre, sexo, etc., y tiene asociadas una
serie de acciones como matricular, evaluar, asistir a clase, presentar tareas, etc. Los
tipos de datos objeto nos permiten representar esos valores y estos
comportamientos de la vida real en una aplicación informática.
Reflexiona
Piensa en un objeto y enumera algunas de sus propiedades y
acciones que se pueden realizar sobre él.
Las variables que formen la estructura de datos de un tipo de dato objeto reciben el
nombre de atributos (que se corresponde con sus propiedades). Las funciones y
4 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Aunque los atributos son públicos, es decir, visibles desde otros programas cliente,
los programas deberían manipular los datos únicamente a través de los
métodos (funciones y procedimientos) que se hayan declarado en el tipo objeto, en
vez de asignar u obtener sus valores directamente. Esto es debido a que los
métodos pueden hacer un chequeo de los datos de manera que se mantenga un
estado apropiado en los mismos. Por ejemplo, si se desea asignar un curso a un
miembro del alumnado, sólo debe permitirse que se asigne un curso existente. Si se
permitiera modificar directamente el curso, se podría asignar un valor incorrecto
(curso inexistente).
5 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Caso práctico
Ya conoce Ana el concepto de las bases de
datos orientadas a objetos y que los tipos
de datos objeto son la base para ellas. Así
que para asentar esos conocimientos se
plantea modificar, con la ayuda de Juan, la
base de datos de la plataforma de juegos
on-line que hasta ahora era relacional para
convertirla en una base de datos orientada
a objetos.
Toda la información que un programa necesita para usar los métodos lo encuentra
en la especificación. Se puede modificar el cuerpo sin cambiar la especificación, sin
que ello afecte a los programas cliente.
Para definir un objeto en Oracle debes utilizar la sentencia CREATE TYPE que tiene el
6 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
siguiente formato:
En caso de que el nombre del tipo de objeto ya estuviera siendo usado para otro
tipo de objeto se obtendría un error. Si se desea reemplazar el tipo anteriormente
creado, por el nuevo que se va a declarar, se puede añadir la cláusula OR
REPLACE en la declaración del tipo de objeto:
Si en algún momento deseas eliminar el tipo de objeto que has creado puedes
utilizar la sentencia DROP TYPE:
Donde nombre_tipo debe ser el nombre del tipo de dato objeto que deseas eliminar.
Por ejemplo, para el tipo de objetos anterior, deberías indicar:
7 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Debes tener en cuenta que no puedes inicializar los atributos usando el operador de
asignación, ni la cláusula DEFAULT, ni asignar la restricción NOT NULL.
El tipo de dato de un atributo puede ser otro tipo de objeto, por lo que la
estructura de datos puede ser tan complicada como sea necesario.
Aquí tienes varios ejemplos de modificación del tipo de objeto Usuario creado
anteriormente:
8 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
9 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Al igual que los subprogramas empaquetados, los métodos tienen dos partes: una
especificación y un cuerpo.
En el cuerpo debes indicar el código que se debe ejecutar para realizar una
determinada tarea cuando el método es invocado. En el siguiente ejemplo se
desarrolla el cuerpo del método que se ha declarado antes:
10 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
END;
/
Al igual que los atributos, los parámetros formales se declaran con un nombre y un
tipo de dato. Sin embargo, el tipo de dato de un parámetro no puede tener
restricciones de tamaño. El tipo de datos puede ser cualquiera de los empleados
por Oracle salvo los indicados anteriormente para los atributos. Las mismas
restricciones se aplican para los tipos de retorno de las funciones.
Puedes usar la sentencia ALTER TYPE para añadir, modificar o eliminar métodos de
un tipo de objeto existente, de manera similar a la utilizada para modificar los
atributos de un tipo de objeto.
11 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Autoevaluación
¿Cómo se denonima a los elementos que realizan determinadas
acciones sobre los objetos?
Atributos.
Métodos.
Tipos de datos objeto.
Parámetros.
12 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
acción.
¡Muy bien!
Solución
1. Incorrecto
2. Opción correcta
3. Incorrecto
4. Incorrecto
13 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
3.4.- Sobrecarga.
Al igual que ocurre con los subprogramas
empaquetados, los métodos pueden ser
sobrecargados, es decir, puedes utilizar el mismo
nombre para métodos diferentes siempre que sus
parámetros formales sean diferentes (en cantidad o
tipo de dato).
Autoevaluación
¿Son correctas las siguientes declaraciones de métodos?
Verdadero.
14 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Falso.
Solución
1. Opción correcta
2. Incorrecto
15 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
16 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
END IF;
RETURN;
END;
END;
17 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Caso práctico
Ada ha observado que Juan y Ana están muy
volcados en el desarrollo de algo. Ellos le cuentan
que están realizando pruebas para modificar sus
bases de datos relacionales para darles
funcionalidades orientadas a objetos.
Una vez que dispones de los conocimientos necesarios para tener declarado un
tipo de dato objeto, vamos a conocer la forma de utilizar los objetos que vayas a
crear de ese tipo.
En los siguientes apartados vas a ver cómo puedes declarar variables que
permitan almacenar objetos, darles un valores iniciales a sus atributos, acceder al
contenido de dichos atributos en cualquier momento, y llamar a los métodos que
ofrece el tipo de objeto utilizado.
18 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Por ejemplo, para declarar una variable denominada u1, que va a permitir almacenar
un objeto del tipo Usuario, debes hacer la siguiente declaración:
u1 Usuario;
setUsuario(u1);
Los objetos se crean durante la ejecución del código como instancias del tipo de
objeto, y cada uno de ellos pueden contener valores diferentes en sus atributos.
19 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
de datos.
Autoevaluación
Suponiendo que tienes declarado el tipo de objeto Factura. ¿Cuál
de las siguientes declaraciones de variable para guardar un
objeto de ese tipo es correcta?
Factura factura1;
factura1 := Factura;
factura1 Factura;
¡Muy bien!
Solución
1. Incorrecto
2. Incorrecto
3. Opción correcta
20 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
El orden de los parámetros debe coincidir con el orden en el que están declarados
los atributos, así como los tipos de datos. El formato sería como el siguiente:
21 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
encuentran los parámetros reales respecto a los parámetros formales, que como se
ha comentado antes coincide con el orden de los atributos.
DECLARE
u1 Usuario;
BEGIN
u1 := NEW Usuario('user1', -10);
/* Se mostrará el crédito como cero, al intentar asignar un crédito negativo */
dbms_output.put_line(u1.credito);
END;
/
Autoevaluación
¿Cuál de las siguientes inicializaciones de objetos es correcta
para el tipo de objeto Factura, suponiendo que dispone de los
atributos número (INTEGER), nombre (VARCHAR2) e importe (NUMBER)?
Solución
1. Opción correcta
2. Incorrecto
22 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
3. Incorrecto
4. Incorrecto
23 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
nombre_objeto.nombre_atributo
Por ejemplo, la consulta del valor de un atributo puede utilizarse como parte de una
asignación o como parámetro en la llamada a una función:
unNombre := usuario1.nombre;
dbms_output.put_line(usuario1.nombre);
Los nombres de los atributos pueden ser encadenados, lo que permite el acceso a
atributos de tipos de objetos anidados. Por ejemplo, si el objeto sitio1 tiene un
atributo del tipo de objeto Usuario, se accedería al atributo del nombre del usuario
con:
sitio1.usuario1.nombre
24 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
parámetro es de tipo OUT o IN OUT lanza una excepción al intentar modificar el valor
de sus atributos.
Autoevaluación
¿Cuál de las siguientes expresiones es correcta para asignar el
valor 50 al atributo importe del objeto factura1?
factura1.importe := 50;
importe.factura1 := 50;
50 := factura1.importe;
Solución
1. Opción correcta
2. Incorrecto
3. Incorrecto
25 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
credito := usuario1.getCredito();
Por ejemplo, si dispones de un objeto sitio1 que tiene declarado un método getUsuario
el cual retorna un objeto del tipo Usuario, puedes realizar con ese valor retornado
una llamada a un método del tipo de objeto Usuario:
Los métodos MEMBER son invocados utilizando una instancia del tipo de objeto:
nombre_objeto.metodo()
En cambio, los métodos STATIC se invocan usando el tipo de objeto, en lugar de una
de sus instancias:
nombre_tipo_objeto.metodo()
26 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Autoevaluación
¿Cuál de las siguientes llamadas al método getImporte es correcto
para el objeto factura1?
valor := getImporte.factura1();
valor := factura1.getImporte();
valor := getImporte().factura1;
Solución
1. Incorrecto
2. Opción correcta
3. Incorrecto
27 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
4.5.- Herencia.
Para indicar que un tipo de objeto es heredado de otro hay que usar la palabra
reservada UNDER, y además hay que tener en cuenta que el tipo de objeto del que
hereda debe tener la propiedad NOT FINAL. Por defecto, los tipos de objeto se
declaran como FINAL, es decir, que no se puede crear un tipo de objeto que herede
de él.
En el siguiente ejemplo puedes ver cómo se crea el tipo de objeto Persona, que se
utilizará heredado en el tipo de objeto UsuarioPersona. De esta manera, este último
tendrá los atributos de Persona más los atributos declarados en UsuarioPersona.
En la creación del objeto puedes observar que se deben asignar los valores para
todos los atributos, incluyendo los heredados.
28 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
DECLARE
u1 UsuarioPersona;
BEGIN
u1 := NEW UsuarioPersona('nombre1', 'apellidos1', 'user1', '01/01/2001', 100);
dbms_output.put_line(u1.nombre);
END;
/
Autoevaluación
Un tipo de objeto que se ha declarado como hijo de otro, ¿hereda
los atributos y métodos del tipo de objeto padre?
Verdadero.
Falso.
Solución
1. Opción correcta
2. Incorrecto
29 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Caso práctico
Juan se ha dado cuenta de que va a tener
un problema cuando necesite realizar
comparaciones y órdenes entre objetos
del mismo tipo.
Por ejemplo, si haces una comparación entre dos objetos Usuario, y deseas saber
si uno es mayor que otro, ¿en base a qué criterio se hace esa comparación? ¿Por el
orden alfabético de apellidos y nombre? ¿Por la fecha de alta? ¿Por el crédito? Hay
que establecer con un método MAP cuál va a ser el valor que se va a utilizar en las
comparaciones.
Un método de MAP sirve para indicar cuál de los atributos del tipo se va a utilizar
con el fin de ordenar los objetos del tipo. Se puede utilizar para comparar los
objetos de ese tipo por medio de los operadores de comparación típicos ().
Para crear un método MAP debes declarar un método que retorne el valor que se
va a utilizar para hacer las comparaciones. El método que declares para ello
debe empezar su declaración con la palabra MAP:
30 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
f_ingreso DATE,
credito NUMBER,
MAP MEMBER FUNCTION ordenarUsuario RETURN VARCHAR2
);
/
En el cuerpo del método se debe retornar el valor que se utilizará para realizar las
comparaciones entre las instancias del tipo de objeto. Por ejemplo, si se quiere
establecer que las comparaciones entre objetos del tipo Usuario se realice
considerando el orden alfabético habitual de apellidos y nombre:
El lenguaje PL/SQL utiliza los métodos MAP para evaluar expresiones lógicas que
resultan valores booleanos como objeto1 > objeto2, y para realizar las comparaciones
implícitas en las cláusulas DISTINCT, GROUP BY y ORDER BY.
31 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Cada tipo de objeto sólo puede tener un método MAP declarado, y sólo puede
retornar alguno de los siguientes tipos: DATE, NUMBER, VARCHAR2, CHARACTER o REAL.
32 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Cada tipo de objeto sólo puede contener un método ORDER, el cual debe retornar
un valor numérico que permita establecer el orden entre los objetos. Si deseas
que un objeto sea menor que otro puedes retornar, por ejemplo, el valor -1. Si vas a
determinar que sean iguales, devuelve 0, y si va a ser mayor, retorna 1. De esta
manera, considerando el valor retornado por el método ORDER, se puede establecer
si un objeto es menor, igual o mayor que otro en el momento de hacer una
ordenación entre una serie de objetos del mismo tipo.
Para declarar qué método va a realizar esta operación, debes indicar la palabra
ORDER delante de su declaración. Debes tener en cuenta que va a retornar un valor
numérico (INTEGER), y que necesita que se indique un parámetro que será del
mismo tipo de objeto. El objeto que se indique en ese parámetro será el que se
compare con el objeto que utilice este método.
Con ese ejemplo, el usuario con login 'luitom64' se considera mayor que el usuario
33 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Debes tener en cuenta que puedes declarar un método MAP o un método ORDER,
pero no los dos.
34 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Autoevaluación
¿Los métodos MAP sólo sirven para evaluar expresiones lógicas
que resultan valores booleanos?
Verdadero.
Falso.
Solución
1. Incorrecto
2. Opción correcta
35 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Caso práctico
Ana ha estudiado los vectores y matrices
que se usan en varios lenguajes de
programación. Le pregunta a Juan si con
las bases de datos objeto-relacionales se
puede utilizar algo parecido para almacenar
los objetos instanciados. Él le dice que para
eso existen las colecciones.
Una colección es un conjunto de elementos del mismo tipo. Puede comparase con
los vectores y matrices que se utilizan en muchos lenguajes de programación. En
este caso, las colecciones sólo pueden tener una dimensión y los elementos se
indexan mediante un valor de tipo numérico o cadena de caracteres. Podrían
definirse como un tipo de tablas con dos columnas, una para los índice y otra para
los datos.
La base de datos de Oracle proporciona los tipos VARRAY y NESTED TABLE (tabla
anidada) como tipos de datos colección.
Una variación de las tablas anidadas son los arrays asociativos, que utilizan
valores arbitrarios para sus índices. En este caso, los índices no tienen que ser
necesariamente consecutivos.
36 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Las colecciones pueden ser declaradas como una instrucción SQL o en el bloque
de declaraciones de un programa PL/SQL. El tipo de dato de los elementos que
puede contener una colección declarada en PL/SQL es cualquier tipo de dato
PL/SQL, excepto REF CURSOR. Los elementos de las colecciones declaradas en SQL,
además no pueden ser de los tipos: BINARY_INTEGER, PLS_INTEGER, BOOLEAN, LONG,
LONG RAW, NATURAL, NATURALN, POSITIVE, POSITIVEN, REF CURSOR, SIGNTYPE, STRING.
Cualquier tipo de objetos declarado previamente puede ser utilizado como tipo de
elemento para una colección.
Una tabla de la base de datos puede contener columnas que sean colecciones.
Sobre una tabla que contiene colecciones se podrán realizar operaciones de
consulta y manipulación de datos de la misma manera que se realiza con tablas con
los tipos de datos habituales.
Autoevaluación
¿Qué tipo de colección tiene un tamaño fijo?
VARRAY.
NESTED TABLE.
37 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Array Asociativo.
Solución
1. Opción correcta
2. Incorrecto
3. Incorrecto
38 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
El tipo_índice representa el tipo de dato que se va a utilizar para el índice. Puede ser
PLS_INTEGER, BINARY_INTEGER o VARCHAR2. En este último tipo se debe indicar entre
paréntesis el tamaño que se va a utilizar para el índice, por ejemplo, VARCHAR2(5).
Hasta que no sea inicializada una colección, ésta es NULL. Para inicializar una
colección debes utilizar el constructor, que es una función con el mismo nombre
que la colección. A esta función se le pasa como parámetros los valores iniciales de
la colección. Por ejemplo:
DECLARE
TYPE Colores IS TABLE OF VARCHAR(10);
misColores Colores;
BEGIN
misColores := Colores('Rojo', 'Naranja', 'Amarillo', 'Verde', 'Azul');
END;
39 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
DECLARE
TYPE Colores IS TABLE OF VARCHAR(10);
misColores Colores := Colores('Rojo', 'Naranja', 'Amarillo', 'Verde', 'Azul');
dbms_output.put_line(misColores(2));
misColores(3) := 'Gris';
DECLARE
colores ListaColores;
BEGIN
INSERT INTO flores VALUES('Rosa', ListaColores('Rojo','Amarillo','Blanco'));
colores := ListaColores('Rojo','Amarillo','Blanco','Rosa Claro');
UPDATE flores SET coloresFlor = colores WHERE nombre = 'Rosa';
SELECT coloresFlor INTO colores FROM flores WHERE nombre = 'Rosa';
END;/
40 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Caso práctico
Aunque Ana ya ha aprendido a almacenar
objetos en memoria gracias a las
colecciones de objetos, necesita
almacenarlos de manera persistente en una
base de datos. Juan va a enseñarle que
puede realizarlo de manera muy parecida a
la gestión de tablas que ya conoce, en la
que se usan los tipos de datos habituales
de las bases de datos.
Siendo NombreTabla el nombre que deseas dar a la tabla que va a almacenar los
objetos del tipo TipoObjeto. Por ejemplo, para crear la tabla UsuariosObj, que
almacene objetos del tipo Usuario:
Debes tener en cuenta que si una tabla hace uso de un tipo de objeto, no podrás
eliminar ni modificar la estructura de dicho tipo de objeto. Por tanto, desde el
41 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
momento en que el tipo de objeto sea utilizado en una tabla, no podrás volver a
definirlo.
Para poder crear este ejemplo previamente debes tener declarado el tipo de objeto
Usuario, que se ha utilizado en apartados anteriores.
Al crear una tabla de esta manera, estamos consiguiendo que podamos almacenar
objetos del tipo Usuario en una tabla de la base de datos, quedando así sus datos
persistentes mientras no sean eliminados de la tabla. Anteriormente hemos
instanciado objetos que se han guardado en variables, por lo que al terminar la
ejecución, los objetos, y la información que contienen, desaparecen. Si esos objetos
se almacenan en tablas no desaparecen hasta que se eliminen de la tabla en la que
se encuentren.
Cuando se instancia un objeto con el fin de almacenarlo en una tabla, dicho objeto
no tiene identidad fuera de la tabla de la base de datos. Sin embargo, el tipo de
objeto existe independientemente de cualquier tabla, y puede ser usado para crear
objetos en cualquier modo.
Las tablas que sólo contienen filas con objetos, reciben el nombre de tablas de
objetos.
42 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Por ejemplo, podemos crear una tabla que contenga, entre otras columnas, una
columna de objetos del tipo Usuario que hemos utilizado anteriormente.
Como puedes comprobar en la siguiente imagen, los datos del campo unUsuario se
muestran como integrantes de cada objeto Usuario, a diferencia de la tabla de
objetos que has visto en el apartado anterior. Ahora todos los atributos del tipo de
objeto Usuario no se muestran como si fueran varias columnas de la tabla, sino que
forman parte de una única columna.
Autoevaluación
En las tablas con columnas de tipo objeto, ¿los atributos se
muestran como columnas de la tabla?
Falso.
Verdadero.
43 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Solución
1. Opción correcta
2. Incorrecto
44 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
El uso más sencillo sería para mostrar todas las filas contenidas en la tabla:
Como puedes apreciar en la imagen, la tabla que forme parte de la consulta puede
ser una tabla de objetos (como la tabla UsuariosObj), o una tabla que contiene
columnas de tipos de objetos (como la tabla Gente).
En las sentencias SELECT que utilices con objetos, puedes incluir cualquiera de las
cláusulas y funciones de agrupamiento que has aprendido para la sentencia
SELECT que has usado anteriormente con las tablas que contienen columnas de
tipos básicos. Por ejemplo, puedes utilizar: SUM, MAX, WHERE, ORDER, JOIN, etc.
Si se trata de una tabla con columnas de tipo objeto, el acceso a los atributos del
objeto se debe realizar indicando previamente el nombre asignado a la columna que
contiene los objetos:
45 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
46 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
En las tablas habituales, cuando querías añadir una fila a una tabla que tenía un
campo VARCHAR le suministrabas a la sentencia INSERT un dato de ese tipo. Pues si
la tabla es de un determinado tipo de objetos, o si posee un campo de un
determinado tipo de objeto, tendrás que suministrar a la sentencia INSERT un objeto
instanciado de su tipo de objeto correspondiente.
Por tanto, si queremos insertar un Usuario en la tabla Gente que hemos creado en
el apartado anterior, previamente debemos crear el objeto o los objetos que se
deseen insertar. A continuación podremos utilizarlos dentro de la sentencia INSERT
como si fueran valores simplemente.
DECLARE
u1 Usuario;
u2 Usuario;
BEGIN
u1 := NEW Usuario('luitom64', 'LUIS', 'TOMAS BRUNA', '24/10/2007', 50);
u2 := NEW Usuario('caragu72', 'CARLOS', 'AGUDO SEGURA', '06/07/2007', 100);
INSERT INTO UsuariosObj VALUES (u1);
INSERT INTO UsuariosObj VALUES (u2);
END;
De una manera más directa, puedes crear el objeto dentro de la sentencia INSERT
directamente, sin necesidad de guardar el objeto previamente en una variable:
INSERT INTO UsuariosObj VALUES (Usuario('luitom64', 'LUIS', 'TOMAS BRUNA', '24/10/2007', 50));
Podrás comprobar los resultados haciendo una consulta SELECT sobre la tabla de la
manera habitual:
47 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
tipo objeto. Por ejemplo, para la tabla Gente que posee entre sus columnas, una de
tipo objeto Usuario, podríamos usar el formato de instanciar el objeto directamente
en la sentencia INSERT, o bien, indicar una variable que almacena un objeto que se
ha instanciado anteriormente:
INSERT INTO Gente VALUES ('22900970P', Usuario('luitom64', 'LUIS', 'TOMAS BRUNA', '24/10/2007', 50), 54);
48 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Si se trata de una tabla de objetos, se hará referencia a los atributos de los objetos
justo detrás del nombre asignado a la tabla. Sería algo similar al formato siguiente:
UPDATE NombreTabla
SET NombreTabla.atributoModificado = nuevoValor
WHERE NombreTabla.atributoBusqueda = valorBusqueda;
UPDATE UsuariosObj
SET UsuariosObj.credito = 0
WHERE UsuariosObj.login = 'luitom64';
UPDATE UsuariosObj u
SET u.credito = 0
WHERE u.login = 'luitom64';
Pero no sólo puedes cambiar el valor de un determinado atributo del objeto. Puedes
cambiar un objeto por otro como puedes ver en el siguiente ejemplo, en el que se
sustituye el usuario con login 'caragu72' por otro usuario nuevo.
UPDATE UsuariosObj u SET u = Usuario('juaesc82', 'JUAN', 'ESCUDERO LARRASA', '10/04/2011', 0) WHERE u.login = 'carag
49 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Si se trata de una tabla con columnas de tipo objeto, se debe hacer referencia al
nombre de la columna que contiene los objetos:
UPDATE NombreTabla
SET NombreTabla.colObjeto.atributoModificado = nuevoValor
WHERE NombreTabla.colObjeto.atributoBusqueda = valorBusqueda;
UPDATE Gente g
SET g.unUsuario.credito = 0
WHERE g.unUsuario.login = 'luitom64';
O bien, puedes cambiar todo un objeto por otro, manteniendo el resto de los datos
de la fila sin modificar, como en el siguiente ejemplo, donde los datos de DNI y
partidasJugadas no se cambia, sólo se cambia un usuario por otro.
UPDATE Gente g
SET g.unUsuario = Usuario('juaesc82', 'JUAN', 'ESCUDERO LARRASA', '10/04/2011', 0)
WHERE g.unUsuario.login = 'caragu72';
50 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
De manera similar se puede realizar el borrado de filas en tablas en las que alguna
de sus columnas son objetos. Puedes comprobarlo con el siguiente ejemplo, donde
se utiliza la tabla Gente, en la que una de sus columnas (unUsuario) es del tipo de
objeto Usuario que hemos utilizado en otros apartados anteriores.
Esta sentencia, al igual que las anteriores, se puede combinar con otras consultas
SELECT, de manera que en vez de realizar el borrado sobre una determinada tabla,
se haga sobre el resultado de una consulta, o bien que la condición que determina
51 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
las filas que deben ser eliminadas sea también el resultado de una consulta. Es
decir, todo lo aprendido sobre las operaciones de manipulación de datos sobre las
tablas habituales, se puede aplicar sobre tablas de tipos de objetos, o tablas con
columnas de tipos de objetos.
52 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
INSERT INTO Favoritos SELECT VALUE(u) FROM UsuariosObj u WHERE u.credito >= 100;
Esa misma función VALUE puedes utilizarla para hacer comparaciones de igualdad
entre objetos, por ejemplo, si deseamos obtener datos de los usuarios que se
encuentren en las tablas Favoritos y UsuariosObj.
DECLARE
u1 Usuario;
u2 Usuario;
BEGIN
53 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
54 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Las referencias se crean utilizando el modificador REF delante del tipo de objeto, y
se puede usar con variables, parámetros, campos, atributos, e incluso como
variables de entrada o salida para sentencias de manipulación de datos en SQL.
DECLARE
u_ref REF Usuario;
p1 Partida;
BEGIN
SELECT REF(u) INTO u_ref FROM UsuariosObj u WHERE u.login = 'luitom64';
p1 := NEW Partida(1, 'partida1', u_ref);
END;
/
Hay que tener en cuenta que sólo se pueden usar referencias a tipos de objetos
que han sido declarados previamente. Siguiendo el ejemplo anterior, no se podría
declarar el tipo Partida antes que el tipo Usuario, ya que dentro del tipo Partida se
utiliza una referencia al tipo Usuario. Por tanto, primero debe estar declarado el tipo
Usuario y luego el tipo Partida.
El problema surge cuando tengamos dos tipos que utilizan referencias mutuas. Es
decir, un atributo del primer tipo hace referencia a un objeto del segundo tipo, y
55 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
56 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Esta función toma una referencia a un objeto y retorna el valor de ese objeto.
Esta función se utiliza como parte de una consulta SELECT, por lo que hay que
utilizar una tabla tras la cláusula FROM. Esto puede resultar algo confuso, ya que las
referencias a objetos apuntan directamente a un objeto concreto que se encuentra
almacenado en una determinada tabla. Por tanto, no debería ser necesario indicar
de nuevo en qué tabla se encuentra. Realmente es así. Podemos hacer referencia a
cualquier tabla en la consulta, y la función DEREF nos devolverá el objeto
referenciado que se encuentra en su tabla correspondiente.
La base de datos de Oracle ofrece la tabla DUAL para este tipo de operaciones. Esta
tabla es creada de forma automática por la base de datos, es accesible por todos
los usuarios, y tiene un solo campo y un solo registro. Por tanto, es como una
tabla comodín.
Por tanto, para obtener el objeto referenciado por una variable REF, debes utilizar
una consulta sobre cualquier tabla, independientemente de la tabla en la que se
encuentre el objeto referenciado. Sólo existe la condición de que siempre se
obtenga una solo fila como resultado. Lo más cómodo es utilizar esa tabla DUAL.
Aunque se use esa tabla comodín, el resultado será un objeto almacenado en la
tabla UsuariosObj.
57 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
58 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
Recurso Recurso
Datos del recurso (1) Datos del rec
(1) (2)
Autoría: Ministerio de
Autoría: Ministerio de Educación. Licencia: Uso E
Licencia: Uso Educativo no comercial. comercial.
Procedencia: Elaboración propia con imagen de Procedencia: Elabo
http://commons.wikimedia.org/wiki/File:View- utilizando la siguiente
refresh.svg http://commons.wikim
/wiki/File:Preferences
Autoría: Ministerio de
Licencia: Uso E
comercial.
Procedencia: Elabora
Autoría: Ministerio de Educación. partir de imágenes
Licencia: Uso Educativo no comercial. público:
Procedencia: Elaboración propia a partir de
imágenes de dominio público: http://commons
/wiki/File:Emble
http://commons.wikimedia.org purple.svg
/wiki/File:Emblem-person-purple.svg http://commons
http://commons.wikimedia.org /wiki/File:Emble
/wiki/File:Emblem-person-yellow.svg yellow.svg
http://commons
/wiki/File:Emble
green.svg
http://commons
59 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
/wiki/File:Emble
red.svg
Autoría: Ministerio de
Licencia: Uso E
comercial.
Procedencia: Elabora
partir de imágenes
público:
http://commons
Autoría: Everaldo Coelho and YellowIcon.
/wiki/File:Emble
Licencia: GNU/GPL.
purple.svg
Procedencia: http://commons.wikimedia.org
http://commons
/wiki/File:Crystal_Clear_device_blockdevice.png
/wiki/File:Emble
green.svg
http://commons
/wiki/File:Emble
red.svg
http://commons
/wiki/File:Docum
Autoría: Ministerio de
Licencia: Uso E
comercial.
Procedencia: Elabora
partir de imágenes
público:
60 de 61 7/10/16 14:15
Uso de bases de datos objeto-relacionales. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_HjLb...
comandos SQL
Oracle Database.
Database.
Autoría: Ministerio de
Licencia: Uso E
Autoría: Ministerio de Educación.
comercial.
Licencia: Uso Educativo no comercial.
Procedencia: Elabora
Procedencia: Elaboración propia a partir de
partir de imágenes
imágenes de dominio público:
público:
http://commons.wikimedia.org
http://commons
/wiki/File:Emblem-person-purple.svg
/wiki/File:Emble
http://commons.wikimedia.org
purple.svg
/wiki/File:Emblem-person-green.svg
http://commons
http://commons.wikimedia.org
/wiki/File:Emble
/wiki/File:Emblem-person-red.svg
green.svg
http://commons.wikimedia.org
http://commons
/wiki/File:Document-save.svg
/wiki/File:Emble
http://commons.wikimedia.org
red.svg
/wiki/File:Emblem-person-yellow.svg
http://commons
/wiki/File:Docum
http://commons.wikimedia.org
/wiki/File:Emblem-person-purple.svg
http://commons.wikimedia.org
/wiki/File:Emblem-person-green.svg
http://commons.wikimedia.org
/wiki/File:Emblem-person-red.svg
http://commons.wikimedia.org
/wiki/File:Document-save.svg
http://commons.wikimedia.org
/wiki/File:Edit-clear.svg
61 de 61 7/10/16 14:15