características objeto relacionales en oracle francisco moreno universidad nacional

24
Características Características Objeto Objeto Relacionales en Relacionales en Oracle Oracle Francisco Moreno Universidad Nacional

Upload: lolita-rojo

Post on 06-Feb-2015

13 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Características Características Objeto Relacionales Objeto Relacionales en Oracleen Oracle

Francisco Moreno

Universidad Nacional

Page 2: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Herencia Oracle solo soporta herencia simple

CLASE XCLASE Xatributos…métodos…

CLASE YCLASE Yatributos…métodos…

CLASE ZCLASE Zatributos…métodos…

CLASE KCLASE Katributos…métodos…

Supertipo

Subtipos

Page 3: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Cada tipo especializado (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 sí pueden redefinir los métodos que hereden y pueden agregar métodos sobrecargados

Los cambios hechos al supertipo se reflejan en los subtipos

* Con nombres distintos a los de su supertipo

Page 4: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Para que un tipo pueda tener subtipos se debe declarar NOT FINALNOT FINAL (la opción predeterminada es FINALFINAL)

Para que puedan existir objetos de un tipo, este debe ser IINSTANTIABLENSTANTIABLE (es la opción predeterminada, es decir, no abstracto)

Para hacerlo abstracto se debe declarar como NOTNOT INSTANTIABLE:INSTANTIABLE:

CREATE OR REPLACE TYPE persona_tipo AS OBJECT( cedula NUMBER(8), nombre VARCHAR2(10)) NOT INSTANTIABLENOT INSTANTIABLE NOT FINAL;/

Page 5: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Se puede cambiar un tipo a NOT FINAL así:

ALTER TYPE nombre_tipo NOT FINAL;

Se puede cambiar de NOT FINAL aFINAL siempre y cuando el tipo no posea subtipos en el momento del cambio

Se puede cambiar de INSTANTIABLE a NOT INSTANTIABLE y viceversa. ¿Cuándo?

Page 6: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

No es válido:

CREATE OR REPLACE TYPE persona_tipo AS OBJECT( cedula NUMBER(8), nombre VARCHAR2(10)) NOT INSTANTIABLENOT INSTANTIABLE FINAL;/

Page 7: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Un métodométodo puede ser: FINALFINAL: No puede ser redefinido por los hijos NOT FINALNOT FINAL: Puede ser redefinido por los

hijos*

Y también puede ser: INSTANTIABLEINSTANTIABLE: El tipo que declara el

método lo implementa en su cuerpo* NOT INSTANTIABLENOT INSTANTIABLE: El tipo que declara el

método no lo implementa (delega la implementación a sus descendientes)

* Es la opción predeterminada

Page 8: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Si un tipo posee un método no instanciable el tipo debe ser a su vez no instanciable ¿Por qué?

CREATE OR REPLACE TYPE persona_tipo AS OBJECT( cedula NUMBER(8), nombre VARCHAR2(10), NOT INSTANTIABLE MEMBER FUNCTION

descripcion RETURN VARCHAR) INSTANTIABLE NOT FINAL;/ Si un subtipo no implementa métodos no

instanciables heredados, debe ser a su vez un tipo no instanciable

Genera error

Page 9: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Ejemplo:

PERSONAPERSONAcédulanombreimprimir()

EMPLEADOEMPLEADO**código…

ESTUDIANTEESTUDIANTEcarné…

PROFESORPROFESORregistroimprimir()imprimir(NUMBER)

* No docente

DE PLANTADE PLANTAsalarioimprimir(VARCHAR)

CATEDRÁTICOCATEDRÁTICOvalor_horaimprimir(DATE)

Método redefinido

Método sobrecargado

Page 10: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Ejemplo

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 UNDERUNDER persona_type(registro NUMBER(5)) NOT FINAL;/

Page 11: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

DROP TYPE profplanta_type FORCE;CREATE TYPE profplanta_type UNDERUNDER profesor_type(salario NUMBER(8)) NOT FINAL;/DROP TYPE profcat_type FORCE;CREATE TYPE profcate_type UNDERUNDER profesor_type(val_hora NUMBER(8)) NOT FINAL;/

Page 12: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Principio de Sustitución:DROP TABLE persona;CREATE TABLE persona OF persona_type(cedula PRIMARY KEY); INSERT INTO persona VALUES(101,'Ana'); INSERT INTO persona

VALUES(persona_type(201,'Luis')); ¡Sorpresa!:¡Sorpresa!: INSERT INTO personapersona

values(profesor_typeprofesor_type(301,'Juan',550)); INSERT INTO personapersona

values(profplanta_typeprofplanta_type(6,'Jim',950,10000));

Page 13: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Principio de Sustitución: “Un objeto perteneciente a un supertipo puede ser remplazado por cualquiera de sus subtipos”

Intuitivamente, en el ejemplo anterior: 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 objeto subtipo, porque este es capaz de proveer todos los atributos que exige el supertipo.

Este proceso también se denomina “widening”

(ampliación)

Page 14: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

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 solo la cédula y

el registro de todos los profesores?No funcionan:

SELECT VALUE(p).registro FROM persona p;

SELECT cedula, registroFROM persona;

Page 15: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Para “descubrir” los atributos exclusivos de profesor se usa la función TREAT:

SELECT cedula,TREATTREAT(VALUE(p) AS profesor_type).registroFROM persona p;

Ahora que pasa con:

SELECT TREATTREAT(VALUE(p) AS profesor_type)FROM persona p; TREAT devuelve NULL si el objeto no

se puede convertir al tipo indicado

Page 16: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

TREAT no convierte un subtipo a supertipo:

CREATE TABLE prof OF profesor_type(cedula PRIMARY KEY);

INSERT INTO prof prof values(profesor_typeprofesor_type(1,'Kim',50));

SELECT TREATTREAT(VALUE(p) AS persona_type)FROM prof p;

Lo deja como profesor_type

Page 17: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Operador IS OF:

SELECT VALUE(p) FROM persona pWHERE VALUE(p) IS OF (profesor_type);

Imprimirá solo los profesores (o subtipos de profesores…)

Si se desean evitar los subtipos de profesor se puede usar el operador ONLY:

SELECT VALUE(p) FROM persona pWHERE VALUE(p) IS OF (ONLY profesor_type);

Page 18: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Redefinición de métodos.Ejemplo:

DROP TYPE fig_typ FORCE;

CREATE TYPE fig_typ AS OBJECT( nombre VARCHAR(10), FINAL MEMBER FUNCTION imp_nom RETURN VARCHAR, MEMBER FUNCTION descr RETURN VARCHAR)NOT FINAL;/

No se puede redefinir

Se puede redefinir

Page 19: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

CREATE OR REPLACE TYPE BODY fig_typ AS

FINAL MEMBER FUNCTION imp_nom RETURN VARCHAR IS

BEGIN RETURN 'Mi nombre es ' ||nombre; END; MEMBER FUNCTION descr RETURN VARCHAR IS BEGIN RETURN 'No sé que tipo de figura soy'; END;END;/

Page 20: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

DROP TYPE cir_typ FORCE;CREATE TYPE cir_typ UNDER fig_typ( radio NUMBER(5), OVERRIDINGOVERRIDING MEMBER FUNCTION descr RETURN VARCHAR);/

Page 21: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

CREATE OR REPLACE TYPE BODY cir_typ AS

OVERRIDING MEMBER FUNCTION descr RETURN VARCHAR IS

BEGIN RETURN 'Soy un círculo malo, mi

radio es ' || TO_CHAR(radio) || ' y me voy a comer a las demás figuras';

END;END;/

Page 22: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

DROP TABLE figura;CREATE TABLE figura OF fig_typ;INSERT INTO figura VALUES('Figura 1');

SELECT m.imp_nom(), m.descr()FROM figura m;

DROP TABLE circulo;CREATE TABLE circulo OF cir_typ;INSERT INTO circulo VALUES('circulo 1',10); SELECT c.imp_nom(), c.descr()

FROM circulo c;

A partir de Oracle 11g, en PL/SQL, es posible invocar desde círculo el método descripción del tipo figura usando generalized invocation:

Page 23: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

Ejemplo Generalized Invocation

DECLAREc cir_typ;BEGINSELECT VALUE(e) INTO c FROM circulo e;DBMS_OUTPUT.PUT_LINE(c.descr);DBMS_OUTPUT.PUT_LINE((c AS fig_typ).descr);END;/

Page 24: Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional

O alternativamente, generar un objeto fig_typ en tiempo de ejecución:

SELECT fig_typ(c.nombre).descr()FROM circulo c;