M2 - Bases de dades / Apunts UF3 : Objectes
De wikiserver
La revisió el 19:04, 25 abr 2021 per Rsort (Discussió | contribucions)
- 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’;