Sie sind auf Seite 1von 14

BASE DE DATOS OBJETO RELACIONAL Bases de Datos Objeto-Relacionales: BDOR. Tecnologa BDOR de Oracle. 2.1.

INTRODUCCION El trmino Base de Datos Objeto Relacional (BDOR) se usa para describir una base de datos que ha evolucionado desde el modelo relacional hacia otra ms amplia que incorpora conceptos del paradigma orientado a objetos. Por tanto, un Sistema de Gestin ObjetoRelacional (SGBDOR) contiene ambas tecnologas: relacional y de objetos. Una idea bsica de las BDOR es que el usuario pueda crear sus propios tipos de datos, para ser utilizados en aquella tecnologa que permita la implementacin de tipos de datos predefinidos. Adems, las BDOR permiten crear mtodos para esos tipos de datos. Con ello, este tipo de SGBD hace posible la creacin de funciones miembro usando tipos de datos definidos por el usuario, lo que proporciona flexibilidad y seguridad. Los SGBDOR permiten importantes mejoras en muchos aspectos con respecto a las BDR tradicionales. Estos sistemas gestionan tipos de datos complejos con un esfuerzo mnimo y albergan parte de la aplicacin en el servidor de base de datos. Permiten almacenar datos complejos de una aplicacin dentro de la BDOR sin necesidad de forzar los tipos de datos tradicionales. Son compatibles en sentido ascendente con las bases de datos relacionales tradicionales, tan familiares a multitud de usuarios. Es decir, se pueden pasar las aplicaciones sobre bases de datos relacionales al nuevo modelo sin tener que rescribirlas. Adicionalmente, se pueden ir adaptando las aplicaciones y bases de datos para que utilicen las funciones orientadas a objetos. Debido a los requerimientos de las nuevas aplicaciones, el sistema de gestin de bases de datos relacionales de Oracle, desde versin 8.i, ha sido significativamente extendido con conceptos del modelo de bases de datos orientadas a objetos. De esta manera, aunque las estructuras de datos que se utilizan para almacenar la informacin siguen siendo tablas, los usuarios pueden utilizar muchos de los mecanismos de orientacin a objetos para definir y acceder a los datos. Oracle proporciona mecanismos para que el usuario pueda definir sus propios tipos de datos, cuya estructura puede ser compleja, y se permite la asignacin de un tipo complejo (dominio complejo) a una columna de una tabla. Adems, se reconoce el concepto de objetos, de tal manera que un objeto tiene un tipo, se almacena en cierta fila de cierta tabla y tiene un identificador nico (OID). Estos identificadores se pueden utilizar para referenciar a otros objetos y as representar relaciones de asociacin y de agregacin. Oracle tambin proporciona mecanismos para asociar mtodos a tipos, y constructores para disear tipos de datos multivaluados (colecciones) y tablas anidadas. 2.2. TIPOS DE DATOS DEFINIDOS POR EL USUARIO

Un tipo de dato define una estructura y un comportamiento comn para un conjunto de datos de las aplicaciones. Los usuarios de Oracle pueden definir sus propios tipos de datos mediante dos categoras: tipos de objetos (object type) y tipos para colecciones (collection type). Para construir los tipos de usuario se utilizan los tipos bsicos provistos por el sistema y otros tipos de usuario previamente definidos. 2.2.1. Tipos de objetos 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 bsico o de un tipo de usuario. Sus mtodos (procedimientos o funciones) escritos en lenguaje PL/SQL (almacenados en la BDOR).

2.2.2. Estructura de un tipo de objeto Un tipo de objeto consta de dos partes: especificacin y cuerpo La especificacin constituye la interface a las aplicaciones; aqu se declaran las estructuras de datos (conjunto de atributos) y las operaciones (mtodos) necesarios para manipular los datos. El cuerpo define los mtodos, es decir, implementa la especificacin. En la figura se representa la estructura de un tipo de objeto:

Toda la informacin que un cliente necesita para utilizar los mtodos se encuentra en la especificacin. Es conveniente pensar en la especificacin como en la interface operacional y en el cuerpo como en una caja negra. Esto permite depurar, mejorar o reemplazar el cuerpo sin necesidad de modificar la especificacin y sin afectar, por tanto, a las aplicaciones cliente. 2.2.3. Caractersticas:

En una especificacin de tipo de objeto los atributos deben declararse antes que cualquiera de los mtodos. Si una especificacin de tipo solo declara atributos, el cuerpo es innecesario. Todas las declaraciones en la especificacin del tipo son publicas. Sin embargo, el cuerpo puede contener declaraciones privadas, que definen mtodos internos del tipo de objeto. El mbito de las declaraciones privadas es local al cuerpo del objeto. 2.2.4. Componentes de un tipo de objeto Un tipo de objeto encapsula datos y operaciones, por lo que en la especificacin solo se pueden declarar atributos y mtodos, pero no constantes, excepciones, cursores o tipos. Se requiere al menos un atributo y los mtodos son opcionales. 2.2.4.1. Atributos 1. Como las variables, un atributo se declara mediante un nombre y un tipo. 2. El nombre debe ser nico dentro del tipo de objeto (aunque puede reutilizarse en otros objetos). 3. El tipo puede ser cualquier tipo de Oracle excepto: LONG y LONG RAW. NCHAR, NCLOB y NVARCHAR2. MLSLABEL y ROWID. Los tipos especficos de PL/SQL: BINARY_INTEGER (y cualquiera de sus subtipos), BOOLEAN, PLS_INTEGER, RECORD, REF CURSOR, %TYPE y %ROWTYPE. Los tipos definidos en los paquetes PL/SQL. 4. Tampoco se puede inicializar un atributo en la declaracin empleando el operador de asignacin o la clusula DEFAULT. 5. Del mismo modo, no se puede imponer la restriccin NOT NULL. 6. Sin embargo, los objetos se pueden almacenar en tablas de la base de datos en las que s es posible imponer restricciones. Las estructuras de datos pueden llegar a ser muy complejas: El tipo de un atributo puede ser otro tipo de objeto (denominado entonces tipo de objeto anidado). Esto permite construir tipos de objeto complejos a partir de objetos simples. Algunos objetos, tales como colas, listas y rboles son dinmicos (pueden crecer a medida que se utilizan). Tambin es posible definir modelos de datos sofisticados utilizando tipos de objeto recursivos, que contienen referencias directas o indirectas a ellos mismos. Los tipos de objetos actan como plantillas para los objetos de cada tipo. A continuacin vemos un ejemplo de cmo definir el tipo de dato Direccion_T en el lenguaje de definicin de datos de Oracle, y cmo utilizar este tipo de dato para definir el tipo de dato de los objetos de la clase de Cliente_T.
EJEMPLO: CREATE TYPE direccion_t AS OBJECT

( calle VARCHAR2(200), ciudad VARCHAR2(200), prov CHAR(2), codpos VARCHAR2(20) ); CREATE TYPE cliente_t AS OBJECT ( clinum NUMBER, clinomb VARCHAR2(200), direccion direccion_t, telefono VARCHAR2(20), fecha_nac DATE, );

2.2.5. Mtodos La especificacin de un mtodo se hace junto a la creacin de su tipo, y debe llevar siempre asociada una directiva de compilacin (PRAGMA RESTRICT_REFERENCES), para evitar que los mtodos manipulen la base de datos o las variables del paquete PL/SQL. Tienen el siguiente significado: WNDS: no se permite al mtodo modificar las tablas de la base de datos WNPS: no se permite al mtodo modificar las variables del paquete PL/SQL RNDS: no se permite al mtodo leer las tablas de la base de datos RNPS: no se permite al mtodo leer las variables del paquete PL/SQL Los mtodos se pueden ejecutar sobre los objetos de su mismo tipo. Si x es una variable PL/SQL que almacena objetos del tipo Cliente_T, entonces x.edad() calcula la edad del cliente almacenado en x. La definicin del cuerpo de un mtodo en PL/SQL se hace de la siguiente manera:
CREATE OR REPLACE TYPE BODY cliente_t AS MEMBER FUNCTION edad RETURN NUMBER IS a NUMBER; d DATE; BEGIN d:= today(); a:= d.ao fecha_nac.ao; IF (d.mes < fecha_nac.mes) OR ((d.mes = fecha_nac.mes) AND (d.dia < fecha_nac.dia)) THEN a:= a-1; END IF; RETURN a; END; END;

2.2.5.1. Constructores En Oracle, todos los tipos de objetos tienen asociado por defecto un mtodo que construye nuevos objetos de ese tipo de acuerdo a la especificacin del tipo. El nombre del mtodo coincide con el nombre del tipo, y sus parmetros son los atributos del tipo. Por ejemplo las siguientes expresiones construyen dos objetos con todos sus valores.
direccion_t(Avenida Sagunto, Puzol, Valencia, E-23523) cliente_t( 2347, Juan Prez Ruz,direccion_t(Calle 779789,12/12/1981) Eo, Onda, Castelln,34568), 696 -

2.2.5.2. Mtodos de comparacin Para comparar los objetos de cierto tipo es necesario indicar a Oracle cul es el criterio de comparacin. Para ello, hay que escoger entre un mtodo MAP u ORDER, debindose definir al menos uno de estos mtodos por cada tipo de objeto que necesite ser comparado. La diferencia entre ambos es la siguiente: Un mtodo MAP sirve para indicar cul de los atributos del tipo se utilizar para ordenar los objetos del tipo, y por tanto se puede utilizar para comparar los objetos de ese tipo por medio de los operadores de comparacin aritmticos (<, >). Por ejemplo, la siguiente declaracin permite decir que los objetos del tipo cliente_t se van a comparar por su atributo clinum.
CREATE TYPE cliente_t AS OBJECT ( clinum NUMBER, clinomb VARCHAR2(200), direccion direccion_t, telefono VARCHAR2(20), fecha_nac DATE, MAP MEMBER FUNCTION ret_value RETURN NUMBER, PRAGMA RESTRICT_REFERENCES(ret_value, WNDS, WNPS, RNPS, RNDS), / *instrucciones a PL/SQL*/ MEMBER FUNCTION edad RETURN NUMBER, PRAGMA RESTRICT_REFERENCES(edad, WNDS)); CREATE OR REPLACE TYPE BODY cliente_t AS MAP MEMBER FUNCTION ret_value RETURN NUMBER IS BEGIN RETURN clinum END; END;

Un mtodo ORDER utiliza los atributos del objeto sobre el que se ejecuta para realizar un clculo y compararlo con otro objeto del mismo tipo que toma como argumento de entrada. Este mtodo devolver un valor negativo si el parmetro de entrada es mayor que el atributo, un valor positivo si ocurre lo contrario y un cero si ambos son iguales. El siguiente ejemplo define un orden para el tipo cliente_t diferente al anterior. Slo una de estas definiciones puede ser vlida en un tiempo dado.
CREATE TYPE cliente_t AS OBJECT ( clinum NUMBER, clinomb VARCHAR2(200), direccion direccion_t, telefono VARCHAR2(20), fecha_nac DATE, ORDER MEMBER FUNCTION cli_ordenados (x IN clientes_t) RETURN INTEGER, PRAGMA RESTRICT_REFERENCES( cli_ordenados, WNDS, WNPS, RNPS, RNDS), MEMBER FUNCTION edad RETURN NUMBER, PRAGMA RESTRICT_REFERENCES(edad, WNDS)); CREATE OR REPLACE TYPE BODY cliente_t AS ORDER MEMBER FUNCTION cli_ordenados (x IN cliente_t)

RETURN INTEGER IS BEGIN RETURN clinum - x.clinum; /*la resta de los dos nmeros clinum*/ END; END;

Si un tipo de objeto no tiene definido ninguno de estos mtodos, Oracle es incapaz de deducir cundo un objeto es mayor o menor que otro. Sin embargo, s puede determinar cundo dos objetos del mismo tipo son iguales. Para ello, el sistema compara el valor de los atributos de los objetos uno a uno: Si todos los atributos son no nulos e iguales, Oracle indica que ambos objetos son iguales. Si alguno de los atributos no nulos es distinto en los dos objetos, entonces Oracle dice que son diferentes. En otro caso, Oracle dice que no puede comparar ambos objetos. 2.2.6. Tablas de objetos Una vez definidos los tipos, stos pueden utilizarse para definir nuevos tipos, tablas que almacenen objetos de esos tipos, o para definir el tipo de los atributos de una tabla. Una tabla de objetos es una clase especial de tabla que almacena un objeto en cada fila y que facilita el acceso a los atributos de esos objetos como si fueran columnas de la tabla. Por ejemplo, se puede definir una tabla para almacenar los clientes de este ao y otra para almacenar los de aos anteriores de la siguiente manera:
CREATE TABLE clientes_ao_tab OF cliente_t (clinum PRIMARY KEY); CREATE TABLE clientes_antiguos_tab ( ao NUMBER, cliente cliente_t );

La diferencia entre la primera y la segunda tabla es que la primera almacena objetos con su propia identidad (OID) y la segunda no es una tabla de objetos, sino una tabla con una columna con un tipo de datos de objeto. Es decir, la segunda tabla tiene una columna con un tipo de datos complejo pero sin identidad de objeto. Adems de esto, Oracle permite considerar una tabla de objetos desde dos puntos de vista: Como una tabla con una sola columna cuyo tipo es el de un tipo de objetos. Como una tabla que tiene tantas columnas como atributos los objetos que almacena. Por ejemplo, se puede ejecutar una de las dos instrucciones siguientes. En la primera instruccin, la tabla clientes_ao_tab se considera como una tabla con varias columnas cuyos valores son los especificados. En el segundo caso, se la considera como con una tabla de objetos que en cada fila almacena un objeto. En esta instruccin la clusula VALUE permite visualizar el valor de un objeto.
INSERT INTO clientes_ao_tab VALUES(2347,Juan Prez Ruz,direccion_t(Calle Castalia, Onda, Castelln, 34568),696-779789,12/12/1981);

SELECT VALUE(c) FROM clientes_ao_tab c WHERE c.clinomb = Juan Prez Ruz;

Las reglas de integridad, de clave primaria, y el resto de propiedades que se definan sobre una tabla, slo afectan a los objetos de esa tabla, es decir no se refieren a todos los objetos del tipo asignado a la tabla. 2.2.7. Referencia entre objetos Los identificadores nicos asignados por Oracle a los objetos que se almacenan en una tabla, permiten que stos puedan ser referenciados desde los atributos de otros objetos o desde las columnas de tablas. El tipo de datos proporcionado por Oracle para soportar esta facilidad se denomina REF. Un atributo de tipo REF almacena una referencia a un objeto del tipo definido, e implementa una relacin de asociacin entre los dos tipos de objetos. Estas referencias se pueden utilizar para acceder a los objetos referenciados y para modificarlos; sin embargo, no es posible operar sobre ellas directamente. Para asignar o actualizar una referencia se debe utilizar siempre REF o NULL. Cuando se define una columna de un tipo a REF, es posible restringir su dominio a los objetos que se almacenen en cierta tabla. Si la referencia no se asocia a una tabla sino que slo se restringe a un tipo de objeto, se podr actualizar a una referencia a un objeto del tipo adecuado con independencia de la tabla donde se almacene. En este caso su almacenamiento requerir ms espacio y su acceso ser menos eficiente. El siguiente ejemplo define un atributo de tipo REF y restringe su dominio a los objetos de cierta tabla.
CREATE TABLE clientes_tab OF cliente_t; CREATE TYPE ordenes_t AS OBJECT ( ordnum NUMBER, cliente REF clientes_t, fechpedido DATE, direcentrega direccion_t ); CREATE TABLE ordenes_tab OF ordenes_t ( PRIMARY KEY (ordnum), SCOPE FOR (cliente) IS clientes_tab );

Cuando se borran objetos de la BD, puede ocurrir que otros objetos que referencien a los borrados queden en estado inconsistente. Estas referencias se denominan dangling references, y Oracle proporciona el predicado llamado IS DANGLING que permite comprobar cundo sucede esto. Las relaciones se establecen mediante columnas o atributos REF. Estas relaciones pueden estar restringidas mediante la clusula SCOPE o mediante una restriccin de integridad referencial (REFERENTIAL). Cuando se restringe mediante SCOPE, todos lo valores almacenados en la columna REF apuntan a objetos de la tabla especificada en la clusula.

Sin embargo, puede ocurrir que haya valores que apunten a objetos que no existen. La restriccin mediante REFERENTIAL es similar a la especificacin de claves ajenas. La regla de integridad referencial se aplica a estas columnas, por lo que las referencias a objetos que se almacenen en estas columnas deben ser siempre de objetos que existen en la tabla referenciada. 2.2.8. Tipos Coleccin Oracle soporta dos tipos de datos coleccin: las tablas anidadas y los varray. Un varray es una coleccin ordenada de elementos. La posicin de cada elemento viene dada por un ndice que permite acceder a los mismos. Cuando se define un varray se debe especificar el nmero mximo de elementos que puede contener (aunque este nmero se puede cambiar despus). Los varray se almacenan como objetos opacos (RAW o BLOB). Una tabla anidada puede tener cualquier nmero de elementos: no se especifica ningn mximo cuando se define. Adems, no se mantiene el orden de los elementos. En las tablas anidadas se consultan y actualizan datos del mismo modo que se hace con las tablas relacionales. Los elementos de una tabla anidada se almacenan en una tabla a parte en la que hay una columna llamada NESTED TABLE ID que referencia a la tabla padre o al objeto al que pertenece.
CREATE TYPE precios AS VARRAY(10) OF NUMBER(12,2); CREATE TYPE lineaped tabla AS TABLE OF lineaped;

Cuando se utiliza una tabla anidada como una columna de una tabla o como un atributo de un objeto, es preciso especificar cual ser su tabla de almacenamiento mediante NESTED TABLE...STORE AS.... A continucion si se tiene los siguientes dos objetos se pide: ORDEN Id_orden Fecha DETALLES Id_detalle cantidad

a) Se crea un tipo tabla anidada para manejar los detalles b) Se crea una tabla clsica 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

Grficamente: Id_orden

fecha

detalle
id_prod 1 2 4 7 id_prod 2 4 5 cantidad 23 12 25 2 cantidad 11 6 7

10

25/03/2008

11

25/03/2008

a) Se crea normalmente el tipo para los detalles:


DROP TYPE tipo_detalle FORCE; CREATE OR REPLACE TYPE tipo_detalle AS OBJECT ( id_producto NUMBER(3), cantidad NUMBER(10) );

b) Se crea el tipo de la tabla anidada basada en el tipo tipo_detalle:


CREATE OR REPLACE TYPE tipo_tabla_detalle AS TABLE OF tipo_detalle;

Ahora ya es posible declarar la columna detalles de tipo tipo_tabla_detalle (tabla anidada de detalles):
DROP TABLE orden PURGE; CREATE TABLE orden ( id_orden NUMBER(3) PRIMARY KEY, fecha DATE NOT NULL, detalles tipo_tabla_detalle ) NESTED TABLE detalles STORE AS store_detalles;

Esto que significa? detalles es el nombre de la columna y contiene para cada orden su tabla anidada de detalles. store_detalles es el nombre fsico del lugar (tabla) donde se almacenan todas las tablas anidadas de la columna detalles. Esta tabla no se puede accesar directamente*, slo a travs de la columna detalles. Directamente es intocable, slo se puede describir. Si se quiere insertar los datos mostrados en el grafico anterior:

INSERT INTO orden VALUES(100,SYSDATE, tipo_tabla_detalle( detalle_tip(1,23), tipo_detalle(2,12), tipo_detalle(4,25), tipo_detalle(7,2)) ); La seleccin es normal: SELECT * FROM orden;

--Imprime cada orden acompaada de todos sus items


SELECT detalles, id_orden FROM orden;

--Imprime el cdigo de cada orden y sus detalles Qu pasa si se desea imprimir el cdigo de cada orden slo con el cdigo de los productos de sus detalles? Para agregar ms detalles a la orden # 10, se requiere usar el operador TABLE, para acceder a la tabla anidada as:
INSERT INTO TABLE (SELECT detalles FROM orden WHERE id_orden=10) VALUES(31,330); INSERT INTO TABLE (SELECT detalles FROM orden WHERE id_orden=20) VALUES(32,30);

Considrese 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);

Tabla anidada nula

--Genera el error:
ORA-22908: reference to NULL table value

Entonces cmo llenarla? Lo que se debe hacer es un update de la siguiente manera:


UPDATE orden SET detalles = Tipo_tabla_detalle ( tipo_detalle(10,1000), tipo_detalle(11,1100), tipo_detalle(12,1200)) WHERE id_orden = 10;

Supngase que se realiza lo siguiente:

DELETE FROM TABLE(SELECT detalles FROM orden WHERE id_orden=10);

Para insertar los detalles de la orden 111, se puede proceder* as:


INSERT INTO TABLE (SELECT detalles FROM orden WHERE id_orden=10) VALUES(10,2000); Conclusin: Tabla

anidada tomicamente nula

Tabla anidada vaca Tambien se puden crear tipos coleccin multinivel, que son tipos coleccin cuyos elementos son colecciones.
CREATE TYPE satelite AS OBJECT ( nombre VARCHAR2(20), diametro NUMBER ); CREATE TYPE tab satelite AS TABLE OF satelite; CREATE TYPE planeta AS OBJECT ( nombre VARCHAR2(20), masa NUMBER, satelites tab_satelite ); CREATE TYPE tab_planeta AS TABLE OF planeta;

En este caso, la especificacin de las tablas de almacenamiento se debe hacer para todas y cada una de las tablas anidadas.
CREATE TABLE estrellas ( nombre VARCHAR2(20), edad NUMBER, planetas tab_planeta ) NESTED TABLE planetas STORE AS tab_alm_planetas (NESTED TABLE satelites STORE AS tab_alm_satelites);

Para crear una instancia de cualquier tipo de coleccin tambin se utiliza el mtodo constructor, tal y como se hace con los objetos.
INSERT INTO estrellas VALUES('Sol',23, tab_planeta( planeta('Neptuno',10, tab_satelite( satelite('Proteus',67),

satelite('Triton',82) ) ), planeta('Jupiter',189, tab satelite( satelite('Calisto',97), satelite('Ganimedes',22) ) ) ) );

2.2.9. Herencia de tipos La versin 9i es la primera versin de Oracle que soporta herencia de tipos. Cuando se crea un subtipo a partir de un tipo, el subtipo hereda todos los atributos y los mtodos del tipo padre. Cualquier cambio en los atributos o mtodos del tipo padre se reflejan automticamente en el subtipo. Un subtipo se convierte en una versin especializada del tipo padre cuando al subtipo se le aaden atributos o mtodos, o cuando se redefinen mtodos que ha heredado, de modo que el subtipo ejecuta el mtodo a su manera. A esto es a lo que se denomina polimorfismo ya que dependiendo del tipo del objeto sobre el que se invoca el mtodo, se ejecuta uno u otro cdigo. Cada tipo puede heredar de un solo tipo, no de varios a la vez (no soporta herencia mltiple), pero se pueden construir jerarquas de tipos y subtipos. Cuando se define un tipo de objeto, se determina si de el se pueden derivar subtipos mediante la clusula NOT FINAL. Si no se incluye esta clusula, se considera que es FINAL (no puede tener subtipos). Del mismo modo, los mtodos pueden ser FINAL o NOT FINAL. Si un mtodo es final, los subtipos no pueden redefinirlo (override) con una nueva implementacin. Por defecto, los mtodos son no finales (es decir, redefinibles).
CREATE TYPE t AS OBJECT ( ..., MEMBER PROCEDURE imprime(), FINAL MEMBER FUNCTION fun(x NUMBER) ... ) NOT FINAL;

Para crear un subtipo se utiliza la clusula UNDER.


CREATE TYPE estudiante UNDER persona ( ..., titulacion VARCHAR2(30), fecha ingreso DATE ) NOT FINAL;

El nuevo tipo, adems de heredar los atributos y mtodos del tipo padre, define dos nuevos atributos. A partir del subtipo se pueden derivar otros subtipos y del tipo padre tambin se pueden derivar mas subtipos. Para redefinir un mtodo, se debe utilizar la clusula OVERRIDING.

Los tipos y los mtodos se pueden declarar como no instanciables. Si un tipo es no instanciable, no tiene mtodo constructor, por lo que no se pueden crear instancias a partir de el. Un mtodo no instanciable se utiliza cuando no se le va a dar una implementacin en el tipo en el que se declara sino que cada subtipo va a proporcionar una implementacin distinta.
CREATE TYPE t AS OBJECT ( x NUMBER, NOT INSTANTIABLE MEMBER FUNCTION fun() RETURN NUMBER ) NOT INSTANTIABLE NOT FINAL;

Un tipo puede definir varios mtodos con el mismo nombre pero con distinta signatura. La signatura es la combinacin del nombre de un mtodo, el nmero de parmetros, los tipos de estos y el orden formal. A esto se le denomina sobrecarga de mtodos (overloading). En una jerarqua de tipos, los subtipos son variantes de la raz. Por ejemplo, en tipo estudiante y el tipo empleado son clases de persona. Normalmente, cuando se trabaja con jerarquas, a veces se quiere trabajar a un nivel mas general (por ejemplo, seleccionar o actualizar todas las personas) y a veces se quiere trabajar slo son los estudiantes o slo con los que no son estudiantes. La habilidad de poder seleccionar todas las personas juntas, pertenezcan o no a algn subtipo, es lo que se denomina sustituibilidad. Un supertipo es sustituible si uno de sus subtipos puede sustituirlo en una variable, columna, etc. Declarada del tipo del supertipo. En general, los tipos son sustituibles. Un atributo definido como REF miTipo puede contener una REF a una instancia de miTipo o a una instancia de cualquier subtipo de miTipo. Un atributo definido de tipo miTipo puede contener una instancia de miTipo o una instancia de cualquier subtipo de miTipo. Una coleccin de elementos de tipo miTipo puede contener instancias de miTipo o instancias de cualquier subtipo de miTipo. Dado el tipo libro:
CREATE TYPE libro AS OBJECT ( titulo VARCHAR2(30), autor persona );

se puede crear una instancia de libro especificando un ttulo y un autor de tipo persona o de cualquiera de sus subtipos, estudiante o empleado: libro('BD objeto-relacionales',estudiante(123,'Maria Gil','C/Mayor,3','II','10-OCT-99') A continuacin se muestra un ejemplo de la sustituibilidad en las tablas de objetos.
CREATE TYPE persona AS OBJECT (id NUMBER, nombre VARCHAR2(30), direccion VARCHAR2(30)) NOT FINAL;

CREATE TYPE estudiante UNDER persona (titulacion VARCHAR2(10), especialidad VARCHAR2(30)) NOT FINAL; CREATE TYPE estudiante doctorado UNDER estudiante (programa VARCHAR2(10)); CREATE TABLE personas tab OF persona; INSERT INTO personas tab VALUES (persona(1234,'Ana','C/Mayor,23')); INSERT INTO personas tab VALUES (estudiante(2345,'Jose','C/Paz,3','ITDI','Mecanica')); INSERT INTO personas tab VALUES (estudiante doctorado(3456,'Luisa','C/Mar,45','IInf',NULL,'CAA'));

Das könnte Ihnen auch gefallen