Вы находитесь на странице: 1из 63

Bases de Datos Avanzadas

Dra Elzbieta Malinowski G.


Bases de datos objeto-relacionales
Oracle 11g
El siguiente material est basado en Oracle Database Object-Relational Developers
Guide, 11g Release 1 (11.1), Agosto, 2008
Dra Elzbieta Malinowski G.

Componentes objeto-relacionales en Oracle 11g (1)

Oracle extendi BDRs permitiendo uso de los objetos en la


forma parecida de la propuesta por los estndares SQL:99 y
SQL:03
La interface de objetos ofrece las funcionalidades estndar de
las BDR (SQL, control de concurrencia, recuperacin y
respaldo, otros)
SQL Plus y otras interfaces de programacin (PL/SQL, Java,
Oracle call interface) se modificaron para manejar los objetos

Dra Elzbieta Malinowski G.

Componentes objeto-relacionales en Oracle 11g (2)

Las extensiones OR corresponden a diferentes elementos de


SQL3:

Tipos definidos por el usuario (UDT)


Tipos REF
Tablas tipadas
Colecciones

Dra Elzbieta Malinowski G.

Object types en Oracle 11g (1)

Object type corresponde a UDT de SQL3

Contiene atributos y mtodos definidos en la interfase pblica 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 ));
Dra Elzbieta Malinowski G.

Object types en Oracle 11g (2)


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;
Dra Elzbieta Malinowski G.
END;

Mtodos

Los mtodos permiten definir el comportamiento del tipo


objecto
Oracle define los tipos generales de los mtodos

Constructor: definido implcitamente 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 ningn tipo particular de objeto, son globales

Dra Elzbieta Malinowski G.

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

Dra Elzbieta Malinowski G.

Mtodos: member (1)

Son especficos 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 parmetro SELF (built-in)

Puede ser explcitamente definido, pero no es necesario

Dra Elzbieta Malinowski G.

Mtodos: member (2)

Existen dos tipos especiales de mtodos 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 comparacin y ordenamiento.
Cuando existe se invoca automticamente en, por ejemplo, DISTINCT,
GROUP BY or ORDER BY
ORDER (ORDER MEMBER FUNCTION): permiten la comparacin
(menor, igual, mayor) entre dos objetos devolviendo -1, 0, 1. Cuando
existe se invoca automticamente para las comparaciones entre objetos
Solo puede existir un mtodo MAP o ORDER, no los dos
simultneamente

Dra Elzbieta Malinowski G.

Uso de los object types

Igual que en SQL3, el object type se puede usar como


variables, parmetros, para definir el dominio de la columna o
elementos de una tabla
CREATE TABLE contacts (
person person_type,
contact_date DATE );

Column object

CREATE TABLE person_table OF person_type;

Dra Elzbieta Malinowski G.

Table object

10

Objetos en columna (1)

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:
Se reserva espacio en la tabla
INSERT INTO contacts VALUES
(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);
Dra Elzbieta Malinowski G.

11

Objetos en columna (2)

Se pueden invocar mtodos


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;
Dra Elzbieta Malinowski G.

12

Restricciones

Para objetos en columnas se pueden definir restricciones de


los atributos presentes en nivel hoja
CREATE TYPE location_type AS OBJECT (
building_no NUMBER,
city VARCHAR2(40) );
CREATE TABLE department_mgrs (
dept_no NUMBER PRIMARY KEY,
dept_name CHAR(20),
dept_mgr person_type,
dept_loc location_type,
CONSTRAINT dept_loc_cons1 UNIQUE (dept_loc.building_no, dept_loc.city),
CONSTRAINT dept_loc_cons2 CHECK (dept_loc.city IS NOT NULL) );
Dra Elzbieta Malinowski G.

13

Valores por defecto

Se puede usar los constructores para definir los valores por


defecto
CREATE TABLE department_mgrs (
dept_no NUMBER PRIMARY KEY,
dept_name CHAR(20),
dept_mgr person_type DEFAULT person_type(0,Algo,NA,nuevo@nuevo.com, NULL); ,
dept_loc location_type DEFAULT location_type(),
CONSTRAINT dept_loc_cons1 UNIQUE (dept_loc.building_no, dept_loc.city),
CONSTRAINT dept_loc_cons2 CHECK (dept_loc.city IS NOT NULL) );

Dra Elzbieta Malinowski G.

14

Tablas tipo objeto (object tables) (1)

Object tables corresponden a tablas tipadas de SQL3


Cada tupla representa a un objeto
Objeto no puede ser nulo
Esta tabla se puede ver como:

Tabla con una columna de tipo objeto


Tabla con varias columnas definidas en el tipo objeto

Por defecto cada objeto en object table tiene asignado OID


(Oracle usa identificador lgico)

Dra Elzbieta Malinowski G.

15

Tablas tipo objeto (object tables) (2)

Se puede definir las restricciones para object table de la


misma forma como se hace para las tablas convencionales

Las restricciones se refieren a los atributos del nivel de hoja


(escalares)

CREATE TABLE person_obj_table OF person_typ (


idno
PRIMARY KEY
last_name NOT NULL);

Dra Elzbieta Malinowski G.

16

Tablas tipo objeto (object tables) (2)

En la definicin de la tabla se puede especificar el tipo de OID


Oracle permite dos tipos de OID

System generated (la opcin por defecto)


OBJECT IDENTIFIER IS SYSTEM GENERATED

Primary key
CREATE TABLE person_obj_table OF person_type (
idno
PRIMARY KEY
name
NOT NULL)
OBJECT IDENTIFIER IS PRIMARY KEY;

Dra Elzbieta Malinowski G.

17

Tablas tipo objeto (object tables) (3)

Se inserta datos invocando el constructor


INSERT INTO person_obj_table VALUES (
person_type(101, 'John', 'Smith', 'jsmith@oracle.com', '1-800-555-1212') );

Se puede consultar la tabla, modificar un atributo del objeto o


borrar un objeto usando las expresiones path
SELECT p.first_name, p.last_name
FROM person_obj_table p
WHERE p.idno = 101;
UPDATE person_obj_table p
SET p.last_name = Brenes
WHERE p.idno = 12;
DELETE FROM person_obj_table p
WHERE p.idno = 12;
Dra Elzbieta Malinowski G.

18

Tablas tipo objeto (object tables) (4)

O se puede usar la funcin VALUE que devuelve las instancias


de objetos correspondientes a las filas de la object table

devolver los valores del objeto entero

SELECT VALUE(p) FROM person_obj_table p


WHERE p.last_name = 'Smith';

modificar ya existente

UPDATE person_obj_table p
SET VALUE(p) = person_typ(12, 'Bob Jones', '1-800-555-1243')
WHERE p.idno = 12;

Dra Elzbieta Malinowski G.

19

Tipo REF: general

REF representa un puntero lgico a la tupla de object table que


Oracle construye tomando en cuenta OID, los metadatos sobre
la tabla y otros elementos
REF es un tipo built-in
Su tamao depende de diferentes caractersticas que se define
durante su declaracin

Por ejemplo, si se define la clusula SCOPE su tamao diminuye ya que


no se considera los metadatos relacionados con la tabla

Oracle REF tiene la funcionalidad de REF como se explic para


SQL3

Dra Elzbieta Malinowski G.

20

Tipo REF: ejemplo (1)


CREATE TYPE emp_person_typ AS OBJECT (
name VARCHAR2(30),
manager REF emp_person_typ );
/
CREATE TABLE emp_person_obj_table OF emp_person_typ;
INSERT INTO emp_person_obj_table VALUES (emp_person_typ ('John Smith', NULL));
INSERT INTO emp_person_obj_table
SELECT emp_person_typ ('Bob Jones', REF(e))
FROM emp_person_obj_table e
WHERE e.name = 'John Smith';

Dra Elzbieta Malinowski G.

21

Tipo REF: ejemplo (2)


SELECT * FROM emp_person_obj_table e; John Smith
Bob Jones

01067C2EABBE040578

Se puede acceder el objeto referenciado por medio de REF


usando el operador DEREF

SELECT DEREF(e.manager) FROM emp_person_obj_table e;


emp_person_type(John Smith, NULL)

O se puede usar la expresin path para implcitamente


dereferenciar a REF
SELECT e.manager.name FROM emp_person_obj_table e;
John Smith
Dra Elzbieta Malinowski G.

22

Tipo REF: scope (3)

Se puede restringir las referencias de una tabla especfica


usando scoped REF
CREATE TABLE contacts_ref (
contact_ref REF person_type SCOPE IS person_obj_table,
contact_date DATE );

Scoped REF requiere menos almacenamiento y el acceso es


ms eficiente

Dra Elzbieta Malinowski G.

23

Tipo REF: referencias dangling

Un identificador al objeto aunque incluye la clusula SCOPE


puede llevar a un objeto que no es accesible porque se borr
de la BDs o se cancel los privilegios al usuario
Este tipo de referencias se llama en Oracle dangling REF
Oracle incluye el predicado IS DANGLING para verificar la
condicin de dangling
Las referencias dangling pueden ser evitadas si se define las
restricciones de la integridad referencial para la columna REF
en la forma similar que para llaves forneas
No se puede especificar la restriccin de llave primaria para la
columna tipo REF
Dra Elzbieta Malinowski G.

24

Herencia entre tipos (1)

Oracle permite la herencia simple entre UDTs


Se usan las regalas conocidas sobre la herencia de los atributos
y mtodos

Super-tipo tipo tiene que incluir la clusula 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 mtodos pueden ser tambin FINAL o NOT FINAL (por defecto)
independientemente de la correspondiente declaracin para la
estructura del tipo
Dra Elzbieta Malinowski G.

25

Herencia entre tipos (2)

Los tipos y mtodos pueden ser definidos como NOT


INSTANTIABLE

El tipo no instantiable no permite crear instancias y puede ser usado


para representar las sub-tipos instatiables con la participacin total
Los mtodos se definen como no instantiable cuando se espera que
cada sub-tipo sobrescribe el mtodo
Lea la documentacin de Oracle si ocupa ms informacin

Dra Elzbieta Malinowski G.

26

Herencia entre tipos (3)

La herencia y overriding mtodos se crean similar a SQL3


usando la clusula UNDER y OVERRIDING, respectivamente

CREATE TYPE student_typ UNDER person_typ (


dept_id NUMBER,
major VARCHAR2(30),
OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2)
NOT FINAL;
CREATE TYPE BODY student_typ AS
OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS
BEGIN
RETURN (self AS person_typ).show || ' -- Major: ' || major ;
END;
END;

La invocacin del mtodo del super-tipo se hace por medio de la


sentencia (SELF AS [super-tipo]).[mtodo del super-tipo]
Dra Elzbieta Malinowski G.

27

Herencia entre tipos (4)

Se crea la tabla que contiene las instancias de super- y subtipos insertando valores por medio de la invocacin de
constructores correspondientes
CREATE TABLE person_obj_table OF person_typ;
INSERT INTO person_obj_table
VALUES (person_typ(12, 'Bob Jones', '111-555-1212'));
INSERT INTO person_obj_table
VALUES (student_typ(51, 'Joe Lane', '1-800-555-1312', 12, 'HISTORY'));

Se puede llamar el mtodo show

SELECT p.show() FROM person_obj_table p;


Mtodo show de super-tipo
Resultado: 12 Bob Jones
51 Joe Lane HISTORY
Mtodo show de sub-tipo

Dra Elzbieta Malinowski G.

28

Herencia entre tipos (5)

Oracle maneja el concepto de substitutability que permite


seleccionar los objetos de sub-tipos como parte del supertipo
La consulta sobre la tabla sin especificar el tipo de inters
devuelve todos los objetos del super- y sub-tipos
SELECT VALUE(p) FROM person_obj_table p;

Se puede delimitar los objetos seleccionados usando el


operador IS OF que examina si las instancias del objeto
pertenecen a un nivel de especializacin particular
SELECT VALUE(p)
FROM person_obj_table p
WHERE VALUE(p) IS OF (student_typ);

Devuelve todos los objetos de subtipo student_typ y de los sub-tipos


derivados de este sub-tipo

Dra Elzbieta Malinowski G.

29

Herencia entre tipos (6)

Para delimitar el despliegue a solo los objetos de un tipo


especfico se puede usar la clusula ONLY
SELECT VALUE(p) FROM person_obj_table p
WHERE VALUE(p) IS OF (ONLY student_typ);;

Para poder acceder los atributos y mtodos de sub-tipos se


puede usar la funcin TREAT
SELECT TREAT(VALUE(p) AS student_typ).major
FROM person_obj_table p;
Resultado: devuelve todas las personas de la tabla. Las de tipo estudiante tendrn un valor de
major guardado en la tabla. Las que no perteneces a este tipo tendrn valor NULL

Oracle permite modificar las estructuras jerrquicas, sin


embargo, se requiere conocer los detalles de implementacin
para su manejo adecuado
Dra Elzbieta Malinowski G.

30

Colecciones

Oracle incluye dos tipos de colecciones:

Varray - corresponde a array de SQL3


Nested table corresponde a multiset de SQL3

Las colecciones pueden ser usadas en cualquier lugar


donde se necesita definir tipo (atributo, variable,
parmetro)
Se puede definir el tipo de objeto representando la
coleccin y despus usarlo en la definicin de la tabla

Dra Elzbieta Malinowski G.

31

Varrays (1)

Cada elemento tiene una posicin que corresponde a la


posicin del elemento dentro de la coleccin
El tamao del arreglo indica el nmero mximo de
elementos, pero Oracle almacena tamao variable (de
acuerdo a la cantidad real de elementos que existen)

Por esto los arreglos se llaman varrays

Cada elemento es del mismo tipo

Dra Elzbieta Malinowski G.

32

Varrays (2)

La creacin de una coleccin tipo varray requiere la clusula


CREATE TYPE AS ARRAY OF
CREATE TYPE e_mails_array_typ AS ARRAY OF VARCHAR2(20)

La creacin de tipo (incluyendo varray) no asigna espacio


Este tipo se define para usarlo como

Columna de tabla relacional


Atributo de UDT
Variable o parmetro de la funcin o procedimiento

CREATE TABLE employee_tab (


id NUMBER(5),
name VARCHAR2(35),
e_mails e_mails_array_typ);

Para insertar datos se ocupa invocar constructor


INSERT INTO employee_tab VALUES
(100, Elka, e_mails_array_typ(algo@algo.com, otro@otro.org));
Dra Elzbieta Malinowski G.

33

Varrays (3)

Se puede crear objetos de ms niveles de anidacin


CREATE TYPE phone_typ AS OBJECT (
country_code VARCHAR2(2),
area_code VARCHAR2(3),
ph_number VARCHAR2(7));
CREATE TYPE phone_varray_typ AS VARRAY(5) OF phone_typ;
CREATE TABLE dept_phone_list (
dept_no NUMBER(5),
phone_list phone_varray_typ);

Para insertar datos se ocupa invocar constructores


correspondientes
INSERT INTO dept_phone_list VALUES (100, phone_varray_typ( phone_typ ('01', '650',
'5061111'), phone_typ ('01', '650', '5062222'), phone_typ ('01', '650', '5062525')));
Dra Elzbieta Malinowski G.

34

Varrays (4)

El almacenamiento de varray depende solo del nmero de


elementos presentes en la coleccin
Se guardan en columna de la misma tabla o como LOB, si
su tamao excede 4000 bytes
Varrays tienen mejor desempeo cuando se accede toda la
coleccin porque se guardan en forma comprimida y no
requieren ninguna operacin join

Dra Elzbieta Malinowski G.

35

Nested table (1)

Permite almacenar la coleccin no ordenada de datos sin


especificar el lmite de elementos
Todos los elementos son del mismo tipo pre-definido o
como tipo objeto creado por usuario
Los elementos de la tabla anidada se guardan fsicamente
en otra tabla
La tabla anidada contiene la columna NESTED_TABLE_ID
creada por el sistema que permite identificar la tupla en la
tabla padre, al cual cada elemento pertenece

Dra Elzbieta Malinowski G.

36

Nested table (2)

Dra Elzbieta Malinowski G.

37

Nested table (3)

Para definir la tabla anidada se requiere la clusula


CREATE TYPE AS TABLE OF
CREATE OR REPLACE TYPE CourseList AS TABLE OF VARCHAR2(64);

Parecido a varray se puede usar como

Columna de tabla relacional


Atributo de UDT
Variable o parmetro de la funcin o procedimiento

Dra Elzbieta Malinowski G.

38

Nested table (4)

Ejemplo
CREATE TABLE department (
name
VARCHAR2(20),
director VARCHAR2(20),
office VARCHAR2(20),
courses CourseList)

Nested table

NESTED TABLE courses STORE AS courses_tab;

Para el atributo tipo tabla anidada se especifica el nombre de


la tabla que fsicamente guarda los valores
Para insertar los valores se llama el constructor
INSERT INTO department (name, director, office, courses)
VALUES
('English', 'Lynn Saunders', 'Breakstone Hall 205',
CourseList('Expository Writing', 'Film and Literature', 'Modern Science Fiction'));

Dra Elzbieta Malinowski G.

39

Nested table (5)

Se puede crear objetos de ms niveles de anidacin


CREATE TYPE people_typ AS TABLE OF person_typ;
CREATE TABLE department_persons (
dept_no NUMBER PRIMARY KEY,
dept_name CHAR(20),
dept_mgr person_typ,
dept_emps people_typ)
NESTED TABLE dept_emps STORE AS dept_emps_tab;
INSERT INTO department_persons VALUES ( 101, 'Physical Sciences',
person_typ(65,'Vrinda Mills', '1-800-555-4412'),
people_typ(person_typ(1, 'John Smith', '1-800-555-1212'),
person_typ(2, 'Diane Smith', NULL) ) );
INSERT INTO department_persons VALUES ( 104, 'Life Sciences',
person_typ(70,'James Hall', '1-800-555-4621'), people_typ() );
Dra Elzbieta Malinowski G.

40

Operaciones sobre colecciones (1)

Oracle provee dos formas de consultar las tablas que tienen la


columna o atributo de tipo coleccin

Devuelve la coleccin anidada dentro de la fila


Distribuye (unnest) la coleccin de la forma que cada elemento de la
coleccin aparece en la tupla separada (aplana la relacin)

Usando la primera opcin tanto para varray como para nested


tables
SELECT * FROM employee_tab;
Resultado: 100, Elka, e_mails_array_typ(algo@algo.com, otro@otro.org)
SELECT e.name, e.e_mails FROM employee_tab e;
Resultado: Elka, e_mails_array_typ(algo@algo.com, otro@otro.org)

Dra Elzbieta Malinowski G.

41

Operaciones sobre colecciones (2)

Usando la primera opcin tanto para varray como para nested


tables (cont.)
SELECT d. phone_list people_column FROM dept_phone_list d;
Resultado: phone_varray_typ( phone_typ ('01', '650', '5061111'),
phone_typ ('01', '650', '5062222'),
phone_typ ('01', '650', '5062525
SELECT d.courses FROM department d
Resultado: CourseList('Expository Writing', 'Film and Literature', 'Modern Science Fiction')
SELECT d.dept_emps FROM department_persons d;

Resultado: PEOPLE_TYP(PERSON_TYP(1, 'John Smith', '1-800-555-1212'),


PERSON_TYP(2, 'Diane Smith', '1-800-555-1243'))
Dra Elzbieta Malinowski G.

42

Operaciones sobre colecciones (3)

Para obtener resultado en la forma de la tabla plana se usa la


expresin TABLE con la coleccin

Para array

SELECT p.*
FROM dep_phone_list d, TABLE(d.phone_list) p;

SELECT d.dep_no, p.*


FROM dep_phone_list d,
TABLE(d.phone_list) p;

Resultado
country_code
arrea_code
ph_number
------------------------------------------------------01
650
5061111
01
650
5062222
01
650
5062525

Dra Elzbieta Malinowski G.

43

Operaciones sobre colecciones (4)

Para obtener resultado en la forma de la tabla plana se usa la


expresin TABLE con la coleccin (cont.)

Para nested table

SELECT e.*
FROM department_persons d, TABLE(d.dept_emps) e;
Resultado
idno name
phone
---------- ------------------------------ --------------1
John Smith
1-800-555-1212
2
Diane Smith
1-800-555-1243

La expresin de TABLE puede referirse al alias de la tabla que


aparece a la izquierda left correlation
Dra Elzbieta Malinowski G.

44

Operaciones sobre colecciones (5)

La expresin TABLE puede tambin tener a sub-consulta que


devuelve la coleccin
Ejemplo de la misma consulta que antes
SELECT *
FROM TABLE(SELECT d.phone_list
FROM dep_phone_list d);

Existen tres restricciones para usar TABLE en sub-consultas

La sub-consulta tiene que devolver la coleccin


La sentencia SELECT puede tener solo un elemento
La coleccin que devuelve la sub-consulta tiene que ser simple no
anidada

Dra Elzbieta Malinowski G.

45

Operaciones sobre colecciones (6)

Oracle permite modificar colecciones enteras (varrays y nested


table)

Ejemplo de modificacin entera de atributo tipo array

UPDATE emplyee_tab e
SET e. e_mails = e_mails_array_typ(modificado@gmail.com,otro@otro.org);

Ejemplo de modificacin entera de atributo tipo tablas anidadas

UPDATE department_persons d
SET dept_emps = people_typ(person_typ(5, Juan Morales', '1-650-111-2222'),
person_typ(5, Maria Castro', NULL) );

Sin embargo, solo se puede realizar modificaciones parciales


para la coleccin si sta est definida como nested table

Dra Elzbieta Malinowski G.

46

Operaciones sobre colecciones (5)

Las modificaciones parciales para nested table se hacen


usando la expresn TABLE
UPDATE TABLE( SELECT d.dept_emps
FROM department_persons d
WHERE d.dept_no = 101) e
SET VALUE(e) = person_typ(5, 'Kevin Taylor', '1-800-555-6233')
WHERE e.idno = 5;
DELETE FROM TABLE(
SELECT d.dept_emps
FROM department_persons d
WHERE d.dept_no = 101) e
WHERE e.idno = 5;
Dra Elzbieta Malinowski G.

47

Operaciones sobre colecciones (6)

Para colecciones representadas como nested table Oracle


incluye varios operadores de comparacin, ej., =, <>, IN,
MEMBER OF, etc.
Adicionalmente, define varias operciones que se pueden
realizar con nested tables, como CARDINALITY, COLLECT,
MULTISET EXCEPT (diferencia de conjuntos), MULTISET
INTERSECTION, UNION, etc.
Ver ejemplos especficos en la documentacin de Oracle
Estos operadores y operaciones no se pueden usar con las
colecciones tipo varray

Dra Elzbieta Malinowski G.

48

Colecciones de mltiples niveles (1)

Se pueden usar las colecciones anidadas:

Nested tables de tipo nested table


Nested tables de tipo varray
Varray de tipo nested table
Varrya de tipo varray

Sin embargo su almacenamiento cambia dependiendo cual


tipo de coleccin de usa (varray o nested table)

Ejemplo
Para varray de tipo varray, toda la estructura se guarda en la
tabla en lnea si no excede 4000 bytes
El varray de tipo nested table, toda la estructura se guarda
como LOB: no existe tabla separada
Consultar la documentacin de Oracle
Dra Elzbieta Malinowski G.

49

Colecciones de mltiples niveles (2)

Ejemplo de nested table of varrays


CREATE TYPE email_list_arr AS VARRAY(10) OF VARCHAR2(80);
CREATE TYPE email_list_typ AS TABLE OF email_list_arr;
CREATE TABLE dept_email_list (
dept_no NUMBER,
email_addrs email_list_typ)
NESTED TABLE email_addrs STORE AS email_addrs_nt;

Dra Elzbieta Malinowski G.

50

Colecciones de mltiples niveles (3)

Nested table del tipo nested table

CREATE TYPE location_typ AS OBJECT (


location_id NUMBER(4),
street_address VARCHAR2(40),
postal_code VARCHAR2(12),
city VARCHAR2(30),
state_province VARCHAR2(25));
CREATE TYPE nt_location_typ AS TABLE OF location_typ;
CREATE TYPE country_typ AS OBJECT (
country_id CHAR(2),
country_name VARCHAR2(40),
locations nt_location_typ);
Nested tables de multi-level
CREATE TYPE nt_country_typ AS TABLE OF country_typ;
CREATE TABLE region_tab (
region_id NUMBER,
region_name VARCHAR2(25),
countries nt_country_typ)
NESTED TABLE countries STORE AS nt_countries_tab
(NESTED TABLE locations STORE AS nt_locations_tab);
Dra Elzbieta Malinowski G.

51

Colecciones de mltiples niveles (4)

Constructores
INSERT INTO region_tab VALUES(1, 'Europe', nt_country_typ(
country_typ( 'IT', 'Italy',
nt_location_typ (
location_typ(1000, '1297 Via Cola di Rie','00989','Roma', ''),
location_typ(1100, '93091 Calle della Testa','10934','Venice','') )),
country_typ( 'CH', 'Switzerland',
nt_location_typ (
location_typ(2900, '20 Rue des Corps-Saints', '1730', 'Geneva',
'Geneve'),
location_typ(3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE') )
)));

Dra Elzbieta Malinowski G.

52

Colecciones de mltiples niveles: operaciones

Aplanar (unnest) los resultados de las consultas se puede


tambin para las colecciones de mltiple nivel, para ambos
varrays y nested tables
SELECT r.region_name, c.country_name, l.location_id
FROM region_tab r, TABLE(r.countries) c, TABLE(c.locations) l;

Las operaciones de insert, delete y update para colecciones de


mltiple nivel tipo varray solo se pueden dar para la coleccin
entera
En cambio para mltiple nivel de nested tables se puede hacer
estas operaciones:

Para la coleccin entera


Para elementos seleccionados

Ver ejemplos especficos en la documentacin de Oracle


Dra Elzbieta Malinowski G.

53

Cuando usar varray y nested tables

Se recomienda usar VARRAY cuando

Se tiene un nmero fijo de elementos


Se requiere accederlos en el orden
Para recuperar y manipular la coleccin entera

Se recomienda usar tablas anidadas cuando

Se tiene un nmero arbitrario de elementos


Se quiere asegurar mejor desempeo de consultas sobre las
colecciones (se puede usar ndices)
Se requiere realizar las operaciones masivas de insertar, modificar y
borrar

Dra Elzbieta Malinowski G.

54

Otros aspectos importantes

Como ya conocemos la importancia de diseo fsico, antes


de implementar una BDOR se debe adquirir conocimiento
sobre particularidades de implementacin de diferentes
componentes de BDOR
Esto debe ayudar a construir una BD que asegura buen
desempeo
Adems, Oracle ofrece un mecanismo de creacin de object
views que permiten escribir aplicaciones que usan OO sin
cambiar las estructura de ya existentes BD relacionales

Dra Elzbieta Malinowski G.

55

Soporte para objetos en programacin Oracle

Oracle permite la creacin de objetos usando los comandos


DDL y su manipulacin por medio de DML
Estos objetos no pueden ser usados directamente en los LPOO
como C++ o Java
Oracle ofrece varios productos para manejar los objetos en
3GL

PL/SQL
OCI Oracle Call Interface
OCCI - Oracle C++ Call Interface
OO4O Oracle Object For OLE
Java: JDBC y SQLJ

Dra Elzbieta Malinowski G.

56

ORACLE CALL INTERFACE OCI (1)

Es un conjunto de las bibliotecas de funciones C que la


applicacin puede usar para manipular datos y esquemas en
DB de Oracle
Soporta las tcnicas tradicionales (programacin estructurada)
3GL y orientacin por objetos
Contiene un componente importante llamado object cache que
representa un bloque en la memoria del cliente que permite a
los programas guardar el objeto para su manipulacin
Object cache est controlado por los programas de aplicacin
que lo usan y usan la poltica de LRU para seleccionar el objeto
vctima
Dra Elzbieta Malinowski G.

57

ORACLE CALL INTERFACE OCI (2)

OCI provee funciones para

Acceder los objetos en el servidor usando SQL


Acceder, manipular y administrar los objetos en el object cache por
medio de punteros o REFs, por ejemplo
Poner candados en los objetos
Recuperar el grafo de objetos relacionados con el objeto
seleccionado
Traer el objeto referenciado desde otro objeto si el primero todava
no est en el memoria
Guardar en el servidor los cambios hechos a objetos en object
cache
Convertir los datos de Oracle a tipos de C
Dra Elzbieta Malinowski G.

58

ORACLE CALL INTERFACE OCI (3)

El programa que manipula los objetos debe representar los


tipos de objetos en el formato de host language (ej., C)

El implementador debe crear un ejecutable compilando y


enlazando (linking) todos los archivos *.c a la librera OCI
En lugar de OCI se puede usar OCCI

Implementador las define


Uso de Object Type Translator (OTT) que genera el mapeo a C de los
objetos definidos en BD y crea archivos de encabezado (*.h) con la
estructura del objeto

Es una API para C++


Es construida en base de OCI usando wrappers
Es modelada como la interfase JDBC

Pueden tener restricciones en manejo de algunos tipos, por


ejemplo, tablas anidadas
Dra Elzbieta Malinowski G.

59

Precompilador Pro*C/C+

Tiene funcionamiento parecido al OCI pero ofrece ms


opciones, por ejemplo

La conversin automtica de tipos usados en la BD a tipos de C/C++


Revisin durante compilacin de tipos de objtos y colecciones
El uso de C++ e incluye EXEC SQL para crear y eliminar los objetos
El acceso a los objetos usando las sentencias SQL y PL/SQL incrustados
en Pro*C/C++ o usando interfase para el object cache descrito antes

Dra Elzbieta Malinowski G.

60

Oracle Objects for OLE (OO4O)

Provee soporte para acceder y manipular las instancias tipo


REF, valores, colleciones tipo array y tablas anidadas
Se puede usar en la plataforma de Windows que soporta el
protocolo COM, por ejemplo, Excel, ActiveX,

Dra Elzbieta Malinowski G.

61

Java

Oracle provee dos posibilidades para integrar los objetos de la


BD con Java, o sea acceder datos en Java desde BD y guardar
en la BD en forma persistente los objetos Java

JDBC materializa los objetos de la BD creando las clases


correspondientes clases de Java y pasando los datos
Se puede hacerlo de dos formas

JDBC
Oracle SQLJ

Permitir a JDBC crear clases para los atributos y pasar los datos
Especificar en forma manual el mapeo entre los objetos de la BD y las
clases de Java

SQLJ usa las sentencias de SQL incrustadas en lenguaje Java


Ver documentacin de Oracle para ms detalles
Dra Elzbieta Malinowski G.

62

LA FELICIDAD HUMANA
GENERALMENTE NO SE LOGRA
CON GRANDES GOLPES DE SUERTE,
QUE PUEDEN OCURRIR POCAS VECES,
SINO CON PEQUEAS COSAS
QUE OCURREN TODOS LOS DAS
Benjamin Franklin

Dra Elzbieta Malinowski G.

63

Вам также может понравиться