Características Objeto Relacionales en Oracle 10G * 27/05/2016

Download Report

Transcript Características Objeto Relacionales en Oracle 10G * 27/05/2016

Características Objeto
Relacionales en Oracle 10G *
* Tomado del curso de Francisco Moreno
27/05/2016
Seminario de Bases de Datos
1
Tipos
Ejemplo: Sean los tipos:
CREATE TYPE dir_tipo AS OBJECT(
dir VARCHAR2(10),
ciudad VARCHAR2(20)
);
/
CREATE TYPE persona_tipo AS OBJECT(
ced VARCHAR2(10),
nombre VARCHAR2(10),
p_dir dir_tipo
);
/
27/05/2016
Seminario de Bases de Datos
2
CREATE TYPE vendedor_tipo AS OBJECT(
territorio VARCHAR2(10),
v_datos persona_tipo
);
/
CREATE TYPE vend_com_tipo AS OBJECT(
por_comision NUMBER(3),
vc_datos vendedor_tipo
);
/
27/05/2016
Seminario de Bases de Datos
3
Diagrama de uso de los
tipos:
dir_tipo
persona_tipo
Usado por
vendedor_tipo
Usado por
vend_com_tipo
Usado por
En este caso todos los tipos son instanciables y finales. ¿Hay aquí herencia?
27/05/2016
Seminario de Bases de Datos
4
Creación de una tabla tipada:
CREATE TABLE comisionista OF
vend_com_tipo;
ALTER TABLE comisionista ADD
PRIMARY KEY (vc_datos.v_datos.ced);
27/05/2016
Seminario de Bases de Datos
5
Inserción de datos de los comisionistas:
INSERT INTO comisionista VALUES(
12, vendedor_tipo
('Norte',
persona_tipo('234', 'Pedro',
dir_tipo('Cl 56',
'Bogotá')
)
)
);
27/05/2016
Seminario de Bases de Datos
6
Consultas:
1. Seleccionar la dirección (dir), el nombre y la comisión de
todos los comisionistas:
SELECT por_comision AS comision,
c.vc_datos.v_datos.nombre AS nombre,
c.vc_datos.v_datos.p_dir.dir AS direc
FROM comisionista c;
27/05/2016
Seminario de Bases de Datos
7
2. Seleccionar los datos personales de todos los
comisionistas que viven en Bogotá.
SELECT c.vc_datos.v_datos AS
datos_personales
FROM comisionista c
WHERE
c.vc_datos.v_datos.p_dir.ciudad='Bogotá';
27/05/2016
Seminario de Bases de Datos
8
3. ¿Cuántos comisionistas hay por territorio?
SELECT c.vc_datos.territorio AS terr,
COUNT(*) AS cuantos
FROM comisionista c
GROUP BY c.vc_datos.territorio;
27/05/2016
Seminario de Bases de Datos
9
Supóngase que en la compañía cada vendedor comisionista se
encarga de muchos clientes y un cliente debe ser manejado
por un único comisionista, es decir:
CLIENTE
COMISIONISTA
encargado de
Id_cliente
por_comision
vc_datos
manejado por
c_datos
manager
El manager es un comisionista
27/05/2016
El cliente es una persona
Seminario de Bases de Datos
10

¿Cómo se debe implementar cliente?:
- ¿Como una tabla?
- ¿Crear un tipo y luego la tabla tipada?

¿De qué tipo deberán ser las columnas de cliente? :
- id_cliente  Numérico
- c_datos  persona_tipo
(reutilización del tipo persona_tipo)
- manager  ¿De tipo vend_com_tipo?
¿Qué implicaciones tiene manejarlo así?
27/05/2016
Seminario de Bases de Datos
11
Una alternativa: Se va a crear el tipo
cliente_tipo y luego la tabla tipada:
CREATE TYPE cliente_tipo AS OBJECT(
id_cliente NUMBER(10),
c_datos persona_tipo,
manager REF vend_com_tipo
);
/
CREATE TABLE cliente OF cliente_tipo(
id_cliente PRIMARY KEY,
SCOPE FOR (manager) IS comisionista,
manager NOT NULL);
27/05/2016
Seminario de Bases de Datos
12
Inserción en cliente:
a) Mediante la forma clásica:
INSERT INTO cliente
SELECT 129,
persona_tipo('435', 'Luis',
dir_tipo('Cl 90',
'Medellín')
),
REF(c)
FROM comisionista c
WHERE c.vc_datos.v_datos.ced = '234';
Confrontar con la forma de capturar el REF en el estándar…
27/05/2016
Seminario de Bases de Datos
13
b) Mediante VALUES con SELECT inmerso:
INSERT INTO cliente VALUES (
145,
persona_tipo('438', 'Olgo',
dir_tipo('Cl 97', 'Cali')
),
(SELECT REF(c) FROM comisionista c
WHERE c.vc_datos.v_datos.ced = '234')
);
27/05/2016
Seminario de Bases de Datos
14
Selección:
1. Imprimir el código de todos los clientes y todos los datos de su
manager.
SELECT * FROM
CLIENTE;
No imprime los datos
del manager, sino su puntero
SELECT id_cliente AS codigo,
DEREF(manager) AS datos_manager
FROM cliente;
Función de “dereferenciamiento“
27/05/2016
Seminario de Bases de Datos
15
2. Imprimir la cédula de cada cliente y la cédula de su manager:
SELECT c.c_datos.ced as ced_cliente,
DEREF(manager).vc_datos.v_datos.ced AS ced_manager
FROM cliente c;
¡Así funciona en 9i y 10G pero no en 8i!
También funciona sin necesidad de DEREF:
SELECT c.c_datos.ced AS cedula_cliente,
c.manager.vc_datos.v_datos.ced AS cedula_manager
FROM cliente c;
27/05/2016
Seminario de Bases de Datos
16
3. Imprima cuántos clientes maneja cada manager:
SELECT c.manager.vc_datos.v_datos.ced,
COUNT(*) AS representados
FROM cliente c
GROUP BY c.manager.vc_datos.v_datos.ced;
Pero se puede agrupar por el puntero:
SELECT MAX(c.manager.vc_datos.v_datos.ced),
COUNT(*) AS representados
FROM cliente c
GROUP BY manager;
¿Por qué se requiere una función como MAX aquí?
27/05/2016
Seminario de Bases de Datos
17

Esta consulta también se puede resolver desde la tabla de comisionista:
SELECT c.vc_datos.v_datos.ced,
(SELECT COUNT(*) FROM
cliente WHERE manager = REF(c))
AS representados
FROM comisionista c;
Sin embargo, desde el punto de vista de resultados ¿cuál
puede llegar a ser la diferencia con la consulta anterior?
27/05/2016
Seminario de Bases de Datos
18



DEREF fue inicialmente concebido sólo para
“dereferenciar” todos los atributos de la tupla objeto
a la que apuntaba
Se acepta el acceso a un atributo particular con o sin
DEREF
En conclusión DEREF es una forma más corta de traer
todos los atributos de una tupla objeto a la que se
apunta
27/05/2016
Seminario de Bases de Datos
19
Ejercicios:


Confrontar los ejemplos anteriores contra la
versión relacional.
Modelar la siguiente situación mediante REFs:
Un país tiene departamentos y un departamento
tiene municipios. No use claves foráneas
Y solucionar la siguiente consulta:
Imprimir el nombre de cada municipio y el
nombre del departamento y país al que
pertenece
27/05/2016
Seminario de Bases de Datos
20