Características Objeto Relacionales en Oracle 10G* 26/05/2016
Download
Report
Transcript Características Objeto Relacionales en Oracle 10G* 26/05/2016
Características Objeto
Relacionales en Oracle 10G*
* Tomado del curso de Francisco Moreno
26/05/2016
Seminario de Bases de Datos
1
Herencia en Oracle 10G
Sólo se maneja herencia simple
Supertipo
CLASE X
atributos…
métodos…
CLASE Y
atributos…
métodos…
CLASE K
atributos…
métodos…
CLASE Z
atributos…
métodos…
Subtipos
26/05/2016
Seminario de Bases de Datos
2
-
-
-
*
Cada clase especializada (subtipo) hereda todos los
atributos y métodos del supertipo
Los subtipos pueden añadir sus propios atributos* y
métodos
Los subtipos no pueden cambiar ni eliminar los atributos
que heredan pero si pueden redefinir un método que
hereden y agregar métodos sobrecargados
Con nombres diferentes a los de su supertipo
26/05/2016
Seminario de Bases de Datos
3
Para que un tipo pueda tener subtipos debe
declararse NOT FINAL
Ojo: El defecto es FINAL en Oracle
Ejemplo:
DROP TYPE persona_tipo FORCE;
CREATE TYPE persona_tipo AS OBJECT(
cedula NUMBER(8),
nombre VARCHAR2(10)
) NOT FINAL;
/
26/05/2016
Seminario de Bases de Datos
4
Para que puedan existir objetos de un tipo este debe ser
INSTANTIABLE (es el valor por defecto)
Para hacerlo abstracto se debe declarar NOT INSTANTIABLE
Ejemplo:
CREATE OR REPLACE TYPE
persona_tipo AS OBJECT(
cedula NUMBER(8),
nombre VARCHAR2(10)
) NOT INSTANTIABLE NOT FINAL;
/
26/05/2016
Seminario de Bases de Datos
5
Si un tipo fue creado como FINAL puede ser cambiado a NOT
FINAL así:
ALTER TYPE nombre_tipo NOT FINAL;
Es posibe cambiar un tipo de NOT FINAL a
FINAL siempre y cuando no posea subtipos en el momento
del cambio
También es posible cambiar de INSTANTIABLE a NOT
INSTANTIABLE y viceversa. ¿Bajo qué condiciones?
26/05/2016
Seminario de Bases de Datos
6
No es válida la combinación:
NOT INSTANTIABLE FINAL
¿Por qué?
Un subtipo puede ser definido abstracto aunque
su padre sea INSTANTIABLE
Los cambios hechos en el supertipo se reflejan
en los subtipos
De nuevo se habla
de Evolución del tipo
26/05/2016
Seminario de Bases de Datos
7
Un método también puede ser:
FINAL: No puede ser redefinido por los hijos
NOT FINAL: Puede ser redefinido por los hijos*
Y también pueden ser:
INSTANTIABLE: El tipo que posee el método lo implementa en su
cuerpo*
NOT INSTANTIABLE: El tipo que posee el método lo declara pero no
lo implementa (deja la implementación a sus descendientes)
* Es la opción por defecto
26/05/2016
Seminario de Bases de Datos
8
Si un tipo posee al menos un método no
instanciable dicho tipo deberá ser a su vez no
instanciable ¿Por qué?
Si un subtipo no implementa métodos no
instanciables heredados, a su vez será un tipo no
instanciable
Los métodos son por defecto instanciables y no
finales
26/05/2016
Seminario de Bases de Datos
9
Creando subtipos
Ejemplo:
Método
redefinido
PERSONA
cédula
nombre
imprimir()
EMPLEADO*
código
…
*No docente
26/05/2016
ESTUDIANTE
carnet
…
Método
sobrecargado
PROFESOR
registro
imprimir()
imprimir(NUMBER)
DE PLANTA
salario
imprimir(VARCHAR)
Seminario de Bases de Datos
CATEDRATICO
valor_hora
imprimir(DATE)
10
¿Cuáles son los métodos y atributos de
profesor?
¿Cuáles son los métodos y atributos de un
profesor de planta? ¿de un catedrático?
26/05/2016
Seminario de Bases de Datos
11
Creación de Subtipos
DROP TYPE persona_type FORCE;
CREATE TYPE persona_type AS OBJECT(
cedula NUMBER(8),
nombre VARCHAR2(10)
)NOT FINAL;
/
DROP TYPE profesor_type FORCE;
CREATE TYPE profesor_type UNDER persona_type(
registro NUMBER(5)
)NOT FINAL;
/
26/05/2016
Seminario de Bases de Datos
12
Principio de Sustitución:
DROP TABLE persona PURGE;
CREATE TABLE persona OF persona_type;
INSERT INTO persona VALUES(101,'Ana');
INSERT INTO persona VALUES(persona_type(201,'Luis'));
¡Sorpresa!:
INSERT INTO persona values(profesor_type(301, 'Juan',55700));
26/05/2016
Seminario de Bases de Datos
13
Principio de Sustitución: “Un objeto perteneciente al supertipo X
puede ser remplazado por cualquiera de sus subtipos”
Intuitivamente el ejemplo anterior se puede ver como: Todo
profesor es una persona.
Lo contrario no siempre se cumple: Una persona no
necesariamente es profesor.
Por eso a un objeto se le puede asignar un subtipo, porque el
subtipo es capaz de proveer todos los atributos que exige el
supertipo.
Este proceso también se denomina “widening”
(ampliación)
26/05/2016
Seminario de Bases de Datos
14
SELECT * FROM persona;
No se ven los atributos exclusivos del profesor...
SELECT VALUE(p) FROM persona p;
Se ven todos los datos.
¿Qué pasa si se desea imprimir sólo la cédula y el registro de todos
los profesores?
SELECT cedula, registro
FROM persona;
26/05/2016
Seminario de Bases de Datos
No funciona
15
Para “descubrir” los atributos exclusivos de profesor se puede hacer
uso de la función TREAT:
SELECT cedula,TREAT(VALUE(p) AS
profesor_type).registro
•TREAT devuelve nulo si el objeto no
FROM persona p;
se puede convertir
Ahora qué pasa con:
•TREAT tampoco convierte un subtipo
a supertipo
SELECT TREAT(VALUE(p) AS profesor_type)
FROM persona p;
26/05/2016
Seminario de Bases de Datos
16
En algunos casos es posible lo contrario al
widening, es decir, “narrowing” (estrechamiento).
Sea:
CREATE TABLE profesor OF profesor_type;
INSERT INTO profesor
SELECT TREAT(VALUE(p) AS profesor_type)
FROM persona p WHERE cedula = 301;
Funciona porque el 301 en verdad es un
profesor…si se cambia por el 201 no se realiza la
inserción (la tabla no acepta el objeto nulo que
devuelve TREAT)
26/05/2016
Seminario de Bases de Datos
17
Una forma de evitar los nulos en:
SELECT TREAT(VALUE(p) AS profesor_type)
FROM persona p;
es haciendo uso del operador IS OF:
SELECT VALUE(p)
FROM persona p
WHERE VALUE(p) IS OF (profesor_type);
Imprimirá sólo los profesores (o subtipos de profesores…)
26/05/2016
Seminario de Bases de Datos
18
Si se desean evitar los subtipos
potenciales de profesor se debe usar
ONLY:
SELECT VALUE(p)
FROM persona p
WHERE VALUE(p)
IS OF (ONLY profesor_type);
26/05/2016
Seminario de Bases de Datos
19
Sobreescribiendo métodos.
Ejemplo:
DROP TYPE figura FORCE;
No sobrescribible
CREATE TYPE figura AS OBJECT(
nombre VARCHAR(10),
FINAL MEMBER FUNCTION imprimir_nombre
RETURN VARCHAR,
MEMBER FUNCTION descripcion RETURN VARCHAR
)NOT FINAL;
/
Sobrescribible
26/05/2016
Seminario de Bases de Datos
20
CREATE OR REPLACE TYPE BODY figura AS
FINAL MEMBER FUNCTION imprimir_nombre RETURN VARCHAR IS
BEGIN
RETURN 'Mi nombre es ' ||nombre;
END;
MEMBER FUNCTION descripcion RETURN
VARCHAR IS
BEGIN
RETURN 'No sé qué tipo de figura soy';
END;
END;
/
26/05/2016
Seminario de Bases de Datos
21
DROP TYPE circulo FORCE;
CREATE TYPE circulo UNDER figura(
radio NUMBER(5),
OVERRIDING MEMBER FUNCTION
descripcion RETURN VARCHAR
);
/
26/05/2016
Seminario de Bases de Datos
22
CREATE OR REPLACE TYPE BODY circulo AS
OVERRIDING MEMBER FUNCTION descripcion
RETURN VARCHAR IS
BEGIN
RETURN 'Soy un círculo y mi radio es '
||TO_CHAR(radio);
END;
END;
/
26/05/2016
Seminario de Bases de Datos
23
DROP TABLE mifigura;
CREATE TABLE mifigura OF figura;
INSERT INTO mifigura VALUES('Figura 1');
SELECT m.imprimir_nombre(), m.descripcion()
FROM mifigura m;
DROP TABLE micirculo;
CREATE TABLE micirculo OF circulo;
INSERT INTO micirculo VALUES('circulo 1',10);
SELECT c.imprimir_nombre(), c.descripcion()
FROM micirculo c;
¿Será posible invocar desde círculo el método descripción del tipo figura?
26/05/2016
Seminario de Bases de Datos
24