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