M2 - Bases de dades / Apunts UF4 : BDOR2

De wikiserver
Dreceres ràpides: navegació, cerca
  • El lenguaje PL/SQL admite la herencia simple de tipos de objetos, mediante la cual, puedes definir subtipos de los tipos de objeto. Estos subtipos, o tipos heredados, contienen todos los atributos y métodos del tipo padre, pero además pueden contener atributos y métodos adicionales, o incluso sobreescribir métodos del tipo padre.
  • Se usan las reglas conocidas sobre la herencia de los atributos y métodos:
Super-tipo tipo tiene que incluir la cláusula NOT FINAL (por defecto es FINAL).
CREATE TYPE person_typ AS OBJECT (
   idno NUMBER,
   name VARCHAR2(20),
   phone VARCHAR2(20),
   FINAL MAP MEMBER FUNCTION get_idno RETURN NUMBER,
   MEMBER FUNCTION show RETURN VARCHAR2) /* despliega idno y nombre */
   NOT FINAL;
Los métodos pueden ser también FINAL o NOT FINAL (por defecto) independientemente de la correspondiente declaración para la estructura del tipo.



  • Para indicar que un tipo de objeto es heredado de otro hay que usar la palabra reservada UNDER, y además hay que tener en cuenta que el tipo de objeto del que hereda debe tener la propiedad NOT FINAL . Por defecto, los tipos de objeto se declaran como FINAL , es decir, que no se puede crear un tipo de objeto que herede de él.
  • Si no se indica lo contrario, siempre se pueden crear objetos (instancias) de los tipos de objeto declarados. Indicando la opción NOT INSTANTIABLE puedes declarar tipos de objeto de los que no se pueden crear objetos. Estos tipos tendrán la función de ser padres de otros tipos de objeto.
  • En el siguiente ejemplo puedes ver cómo se crea el tipo de objeto Persona, que se utilizará heredado en el tipo de objeto UsuarioPersona. De esta manera, este último tendrá los atributos de Persona más los atributos declarados en UsuarioPersona. En la creación del objeto puedes observar que se deben asignar los valores para todos los atributos, incluyendo los heredados.
CREATE TYPE Persona AS OBJECT (
   nombre VARCHAR2(20),
   apellidos VARCHAR2(30)
) NOT FINAL;
/
CREATE TYPE UsuarioPersona UNDER Persona (
   login VARCHAR(30),
   f_ingreso DATE,
   credito NUMBER
);
/
DECLARE
   u1 UsuarioPersona;
BEGIN
   u1 := NEW UsuarioPersona('nombre1', 'apellidos1', 'user1', '01/01/2001', 100);
   dbms_output.put_line(u1.nombre);
END;
/