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