M2 - Bases de dades / Apunts UF3 : Objectes

De wikiserver
Dreceres ràpides: navegació, cerca
  • Object type corresponde a UDT de SQL3
-Contiene atributos y métodos definidos en la interfase pública e implementados en la parte privada
-Ejemplo:
CREATE TYPE person_type AS OBJECT (
   idno NUMBER,
   first_name VARCHAR2(20),
   last_name VARCHAR2(25),
   email VARCHAR2(25),
   phone VARCHAR2(20),

   MAP MEMBER FUNCTION get_idno RETURN NUMBER,
   MEMBER FUNCTION get_areacode RETRUN VARCHAR2(5),
   MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ));
CREATE TYPE BODY person_type AS

   MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
   BEGIN
     RETURN idno;
   END;

   MEMBER FUNCTION get_areacode RETURN VARCHAR2(5) IS
   BEGIN
     RETURN SUBSTR(phone,1,3);
   END;

   MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_type ) IS
   BEGIN
   -- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details
     DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name);
     DBMS_OUTPUT.PUT_LINE(email || ' ' || phone);
   END;
END;

Métodos

  • Los métodos permiten definir el comportamiento del tipo objecto
  • Oracle define los tipos generales de los métodos
-Constructor: definido implícitamente para cada objeto pero pueden ser sobrescritos con el constructor definido por el usuario
-Member: permiten acceso a las instancias del objeto
-Static: no usan ningún tipo particular de objeto, son globales

Métodos:constructor

  • Es implicitamente defindo por el sistema para cada tipo creado
  • Su nombre es el mismo que nombre del tipo y permite incluir valores para cada atributo definido en UDT
p=person_type(5,’Elka’,’Malinowski’,’xxx@yyy.com,’506-2222-2222’);
  • Devuelve una instancia nueva del UDT con valores especificados
  • Usuario puede definir su propio constructor

Métodos: member

  • Son específicos al tipo
  • Son definidos por el usuario
Ejemplo: get_areacode() o display_details() para el objeto person_type definido antes
  • Se definen como MEMBER FUNCTION o MEMBER PROCEDURE
  • Pueden usar el parámetro SELF (built-in)
Puede ser explícitamente definido, pero no es necesario
  • Existen dos tipos especiales de métodos member usados para realizar las comparaciones entre instancias de UDT
-MAP (MAP MEMBER FUNCTION): permite especificar cual de los atributos del objeto se usa para la comparación y ordenamiento.
Cuando existe se invoca automáticamente en, por ejemplo, DISTINCT, GROUP BY or ORDER BY
-ORDER (ORDER MEMBER FUNCTION): permiten la comparación (menor, igual, mayor) entre dos objetos devolviendo -1, 0, 1. Cuando existe se invoca automáticamente para las comparaciones entre objetos
- Solo puede existir un método MAP o ORDER, no los dos simultáneamente

Uso de los object types

  • Igual que en SQL3, el object type se puede usar como variables, parámetros, para definir el dominio de la columna o elementos de una tabla
CREATE TABLE contacts (
   person person_type,   -------->  Column object
   contact_date DATE );

CREATE TABLE person_table OF person_type; --------> Table object

Objetos en columna

  • No contienen identificadores propios ya que forman parte de la tupla
  • Se insertan datos invocando el constructor del tipo
INSERT INTO contacts VALUES
(person_type(101, 'Adam', ’Morales’,’algo@nuevo.com’,’506-2222-5555’) , ’24 April 2009’);
  • Los atributos que forman parte del objeto o objeto en sí pueden ser nulos:
INSERT INTO contacts VALUES      Se reserva espacio en la tabla
(person_type(NULL, NULL, NULL, NULL, NULL), ’24 April 2009’);

INSERT INTO contacts VALUES (NULL, ’24 April 2009’); NO se reserva espacio en la tabla
  • Se puede indexar los atributos escalares en nivel de hoja
CREATE INDEX i_last_name ON contacts (person_type.last_name);
  • Se pueden invocar métodos
SELECT c.person.get_areacode()
FROM contacts c;
  • Durante las consultas se devuelve el objeto
SELECT * FROM contacts;
Resultado:
person_type(101, 'Adam', ’Morales’,’algo@nuevo.com’,’506-2222-5555’) ’24 April 2009’
  • Las modificaciones y borrados se realizan usando las expresiones tipo path
UPDATE contacts c
SET c.person.last_name = ‘Mora’

WHERE c. person.last_name = ‘Morales’;
DELETE FROM contacts c
WHERE c.person = ‘Adam’;