La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Características Objeto Relacionales en Oracle

Presentaciones similares


Presentación del tema: "Características Objeto Relacionales en Oracle"— Transcripción de la presentación:

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

2 Oracle solo soporta herencia simple
CLASE X atributos… métodos… CLASE K atributos… métodos… Supertipo CLASE Y atributos… métodos… CLASE Z atributos… métodos… Subtipos

3 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

4 Para que un tipo pueda tener subtipos se debe
declarar NOT FINAL (la opción predeterminada es FINAL) Para que puedan existir objetos de un tipo, este debe ser INSTANTIABLE (es la opción predeterminada, es decir, no abstracto) Para hacerlo abstracto se debe declarar como NOT INSTANTIABLE: CREATE OR REPLACE TYPE persona_tipo AS OBJECT( cedula NUMBER(8), nombre VARCHAR2(10) ) NOT INSTANTIABLE NOT FINAL; /

5 Se puede cambiar un tipo a NOT FINAL así:
ALTER TYPE nombre_tipo NOT FINAL; Se puede cambiar de NOT FINAL a FINAL 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?

6 No es válido: CREATE OR REPLACE TYPE persona_tipo AS OBJECT( cedula NUMBER(8), nombre VARCHAR2(10) ) NOT INSTANTIABLE FINAL; /

7 FINAL: No puede ser redefinido por los hijos
Un método puede ser: FINAL: No puede ser redefinido por los hijos NOT FINAL: Puede ser redefinido por los hijos* Y también puede ser: INSTANTIABLE: El tipo que declara el método lo implementa en su cuerpo* NOT INSTANTIABLE: El tipo que declara el método no lo implementa (delega la implementación a sus descendientes) * Es la opción predeterminada

8 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

9 Ejemplo: Método redefinido PERSONA cédula nombre imprimir() Método
sobrecargado EMPLEADO* código ESTUDIANTE carné PROFESOR registro imprimir() imprimir(NUMBER) DE PLANTA salario imprimir(VARCHAR) CATEDRÁTICO valor_hora imprimir(DATE) * No docente

10 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 UNDER persona_type( registro NUMBER(5)

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

12 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'));

13 Principio de Sustitución:
¡Sorpresa!: INSERT INTO persona values(profesor_type(301,'Juan',550)); INSERT INTO persona values(profplanta_type(6,'Jim',950,10000)); INSERT INTO persona values(profcat_type(61,'Kim',52,10));

14 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)

15 No se ven los atributos exclusivos del profesor...
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 cedula, registro FROM persona; SELECT VALUE(p).registro FROM persona p;

16 SELECT cedula,TREAT(VALUE(p) AS profesor_type).registro
Para “descubrir” los atributos exclusivos de profesor se usa la función TREAT: SELECT cedula,TREAT(VALUE(p) AS profesor_type).registro FROM persona p; Ahora que pasa con: SELECT TREAT(VALUE(p) AS profesor_type) TREAT devuelve NULL si el objeto no se puede convertir al tipo indicado

17 TREAT no convierte un subtipo a supertipo:
CREATE TABLE prof OF profesor_type (cedula PRIMARY KEY); INSERT INTO prof values(profesor_type(1,'Kim',50)); SELECT TREAT(VALUE(p) AS persona_type) FROM prof p; Lo deja como profesor_type

18 Operador IS OF: SELECT VALUE(p) FROM persona p WHERE 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: WHERE VALUE(p) IS OF (ONLY profesor_type);

19 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

20 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 RETURN 'No sé que tipo de figura soy'; /

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

22 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; /

23 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:

24 Ejemplo Generalized Invocation
DECLARE c cir_typ; BEGIN SELECT VALUE(e) INTO c FROM circulo e; DBMS_OUTPUT.PUT_LINE(c.descr); DBMS_OUTPUT.PUT_LINE((c AS fig_typ).descr); END; /

25 O alternativamente, generar un objeto fig_typ en tiempo de ejecución:
SELECT fig_typ(c.nombre).descr() FROM circulo c;

26 SELECT VALUE(p), SYS_TYPEID(VALUE(p)) FROM persona p;
Función SYS_TYPEID Asigna un identificador a cada tipo dentro de la jerarquía de herencia: SELECT VALUE(p), SYS_TYPEID(VALUE(p)) FROM persona p;

27 Ejemplo con varray de punteros y herencia
DROP TYPE emp_varray FORCE; CREATE OR REPLACE TYPE emp_varray AS VARRAY(5) OF REF persona_type; / DROP TABLE dep; CREATE TABLE dep( cod NUMBER(3) PRIMARY KEY, mis_emps emp_varray );

28 El puntero es tipado, lo siguiente genera error:
INSERT INTO dep VALUES(1, emp_varray((SELECT REF(p) FROM persona p WHERE cedula = 6), (SELECT REF(p) FROM prof p WHERE cedula = 1))); El puntero es tipado, lo siguiente genera error: INSERT INTO dep VALUES(2, emp_varray((SELECT REF(f) FROM figura f WHERE nombre = 'Figura 1')));

29 Ejercicio Hacer un trigger que controle que en el varray todos los punteros sean del mismo tipo de objetos, por ejemplo, un varray solo de punteros a profesores Controlar que no haya punteros en NULL ni repetidos


Descargar ppt "Características Objeto Relacionales en Oracle"

Presentaciones similares


Anuncios Google