Características Objeto Relacionales en Oracle



Descargar 346,5 Kb.
Fecha de conversión24.09.2017
Tamaño346,5 Kb.

Características Objeto Relacionales en Oracle

  • Francisco Moreno
  • Universidad Nacional

Herencia

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

Cada tipo especializado (subtipo) hereda todos los atributos y métodos del supertipo

  • 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 podrían redefinir los métodos que heredan y pueden agregar métodos sobrecargados
  • Los cambios hechos al supertipo se reflejan en los subtipos
  • * Con nombres distintos de los de su supertipo
  • 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 que un tipo sea 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;
  • /

Se puede cambiar un tipo a NOT FINAL así:

  • 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?

No es válido:

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

Un método puede ser:

  • 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

Si un tipo posee un método no instanciable el tipo debe ser a su vez no instanciable

  • Si un tipo posee un método no instanciable el tipo debe ser a su vez no instanciable
  • 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

Ejemplo:

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

Ejemplo

  • DROP TYPE persona_type FORCE;
  • CREATE TYPE persona_type AS OBJECT(
  • cedula NUMBER(8),
  • nombre VARCHAR2(20)
  • ) NOT FINAL;
  • /
  • DROP TYPE profesor_type FORCE;
  • CREATE TYPE profesor_type UNDER
  • persona_type(
  • registro NUMBER(5)
  • ) NOT FINAL;
  • /

DROP TYPE profplanta_type FORCE;

  • 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
  • profesor_type(
  • val_hora NUMBER(8)
  • ) NOT FINAL;
  • /

Principio de Sustitución:

  • DROP TABLE persona;
  • CREATE TABLE persona OF persona_type
  • (cedula PRIMARY KEY);
  • INSERT INTO persona VALUES(101,'Lauren Mayberry');
  • INSERT INTO persona VALUES(persona_type(201,'Ariana Grande'));

Principio de Sustitución:

  • ¡Sorpresa!:
  • INSERT INTO persona values(profesor_type(301,'Adam Duritz',55));
  • INSERT INTO persona values(profplanta_type(6,'Matt Goss',95,15));
  • INSERT INTO persona values(profcat_type(61,'George Michael',52,10));

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

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

SELECT * FROM persona;

  • SELECT * FROM persona;
  • No se ven los atributos exclusivos del profesor...
  • SELECT VALUE(p) FROM persona p;
  • Suponga que 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, registro
  • FROM persona;
  • PERSONA_TYPE(101, 'Lauren Mayberry')
  • PERSONA_TYPE(201, 'Ariana Grande')
  • PROFESOR_TYPE(301, 'Adam Duritz', 55)
  • PROFPLANTA_TYPE(6, 'Matt Goss', 95, 15)
  • PROFCAT_TYPE(61, 'George Michael', 52, 10)

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

  • 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)
  • FROM persona p;
  • TREAT devuelve NULL si el objeto no
  • se puede convertir al tipo indicado

TREAT no convierte un subtipo a supertipo:

  • TREAT no convierte un subtipo a supertipo:
  • CREATE TABLE prof OF profesor_type
  • (cedula PRIMARY KEY);
  • INSERT INTO prof values(profesor_type(1,'Rhianna Kenny',50));
  • SELECT TREAT(VALUE(p) AS persona_type)
  • FROM prof p;
  • Lo deja como profesor_type
  • No confundir con Rihanna!

Operador IS OF:

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

Redefinición de métodos.

  • 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;
  • /
  • El método no se puede redefinir
  • El método se puede redefinir

CREATE OR REPLACE TYPE BODY fig_typ AS

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

DROP TYPE cir_typ FORCE;

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

CREATE OR REPLACE TYPE BODY cir_typ AS

  • CREATE OR REPLACE TYPE BODY cir_typ AS
  • OVERRIDING MEMBER FUNCTION descr RETURN VARCHAR IS
  • BEGIN
  • RETURN 'Soy un círculo y mi radio es ' || TO_CHAR(radio);
  • END;
  • END;
  • /

DROP TABLE figura;

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

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

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

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

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;

Ejercicio 1: analizar 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
  • );

INSERT INTO dep VALUES(1,

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

Ejercicio 2

  • 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
  • Ejercicio 3
  • Controlar que no haya punteros en NULL ni repetidos



Compartir con tus amigos:


La base de datos está protegida por derechos de autor ©absta.info 2019
enviar mensaje

    Página principal