Bases de datos objeto-relacionales
Uso de bases de datos objeto-relacionales en Oracle:
Bases de datos objeto-relacionales
Tipos de datos objeto
- Un tipo de dato objeto es un tipo de dato compuesto definido por el usuario. Representa una estructura de datos así como funciones y procedimientos para manipular datos.
- 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 procedimientos del tipo de dato objeto se denominan métodos(que se corresponde con sus acciones).
- 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.
- Durante la ejecución, la aplicación creará instancias de un tipo objeto, es decir, referencias a objetos reales con valores asignados en sus atributos.
Declaración de atributos
- El tipo de dato que puede almacenar un determinado atributo puede ser cualquiera de los tipos de Oracle excepto los siguientes:
- – LONG y LONG RAW .
- – ROWID y UROWID .
- – Los tipos específicos PL/SQL BINARY_INTEGER (y sus subtipos), BOOLEAN, PLS_INTEGER, RECORD, REF, CURSOR , %TYPE , y %ROWTYPE.
- – Los tipos definidos dentro de un paquete PL/SQL.
- No se pueden 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.
Ejemplo:
CREATE OR REPLACE TYPE Usuario AS OBJECT (
login VARCHAR2(10),
nombre VARCHAR2(30),
f_ingreso DATE,
credito NUMBER
);
Definición de métodos
- Un método es un subprograma que declaras en la especificación de un tipo de objeto usando las palabras clave MEMBER o STATIC .
- El nombre no puede ser el mismo que el de tipo de objeto ni el de ninguno de sus atributos.
- Los métodos tienen dos partes: una especificación y un cuerpo.
- En la especificación o declaración se debe encontrar el nombre del método, una lista opcional de parámetros, y, en el caso de las funciones, un tipo de dato de retorno.
Ejemplo:
CREATE OR REPLACE TYPE Usuario AS OBJECT (
login VARCHAR2(10),
nombre VARCHAR2(30),
f_ingreso DATE,
credito NUMBER,
MEMBER PROCEDURE incrementoCredito(inc NUMBER)
);
/
- En el cuerpo se debe indicar el código que se debe ejecutar para realizar una determinada tarea cuando el método es invocado.
Ejemplo:
CREATE OR REPLACE TYPE BODY Usuario AS
MEMBER PROCEDURE incrementoCredito(inc NUMBER) IS
BEGIN
credito := credito + inc;
END incrementoCredito;
END;
/
Métodos Constructores
- Cada tipo de objeto tiene un método constructor, que se trata de una función con el mismo nombre que el tipo de objeto y que se encarga de inicializar los atributos y retornar una nueva instancia de ese tipo de objeto.
- Oracle crea un método constructor por defecto para cada tipo de objeto declarado, cuyos parámetros formales coinciden en orden, nombres y tipos de datos con los atributos del tipo de objeto.
Inicialización de objetos
- Para crear o instanciar un objeto de un determinado tipo de objeto, debes hacer una llamada a su método constructor. Esto lo puedes realizar empleando la instrucción NEW seguido del nombre del tipo de objeto como una llamada a una función en la que se indican como parámetros los valores que se desean asignar a los atributos inicialmente. En una asignación también puedes optar por hacer eso mismo omitiendo la palabra NEW .
- 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:
Por ejemplo, en el caso del tipo de objeto Usuario:
u1 := NEW Usuario('luitom64', 'LUIS ', 'TOMAS BRUÑA', '24/10/07', 100);
Tablas de objetos
También se pueden almacenar los objetos en tablas de igual manera que los tipos de datos habituales de las bases de datos.
CREATE TABLE UsuariosObj OF Usuario;
Uso de la sentencia Select
De manera similar a las consultas que has realizado sobre tablas sin tipos de objetos, puedes utilizar la sentencia SELECT para obtener datos de las filas almacenadas en tablas de objetos o tablas con columnas de tipos de objetos.
SELECT u.nombre, u.apellidos FROM UsuariosObj u WHERE u.credito > 0
Inserción de objetos
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;
Modificación de objetos
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 UsuariosObj
SET UsuariosObj.credito = 0
WHERE UsuariosObj.login = 'luitom64';
Borrado de objetos
DELETE FROM UsuariosObj u WHERE u.credito = 0;
Consultas con la función VALUE
Cuando tengas la necesidad de hacer referencia a un objeto en lugar de alguno de sus atributos, puedes utilizar la función VALUE junto con el nombre de la tabla de objetos o su alias, dentro de una sentencia SELECT . Puedes ver a continuación un ejemplo de uso de dicha función para hacer inserciones en otra tabla (Favoritos) del mismo tipo de objetos:
INSERT INTO Favoritos SELECT VALUE(u) FROM UsuariosObj u WHERE u.credito >= 100;
Usando la cláusula INTO podrás guardar en variables el objeto obtenido en las consultas usando la función VALUE. Una vez que tengas asignado el objeto a la variable podrás hacer uso de ella de cualquiera de las formas que has visto anteriormente en la manipulación de objetos. Por ejemplo, puedes acceder a sus atributos, formar parte de asignaciones, etc.
Ejemplo:
DECLARE
u1 Usuario;
u2 Usuario;
BEGIN
SELECT VALUE(u) INTO u1 FROM UsuariosObj u WHERE u.login = 'luitom64';
dbms_output.put_line(u1.nombre);
u2 := u1;
dbms_output.put_line(u2.nombre);
END;
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.