Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porEsperanza Roldan Modificado hace 10 años
1
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional
2
Tipos y Refs Ejemplo: Sean los tipos: CREATE TYPE dir_tipo AS OBJECT( dir VARCHAR2(10), ciudad VARCHAR2(20) ); / CREATE TYPE persona_tipo AS OBJECT( cod NUMBER(10), hv XMLTYPE,--hoja de vida p_dir dir_tipo ); /
3
CREATE TYPE vendedor_tipo AS OBJECT( territorio VARCHAR2(10), v_datos persona_tipo ); / Usado por dir_tipo persona_tipo vendedor_tipo ¿Hay aquí herencia?
4
Creación de una tabla tipada: CREATE TABLE vendedor OF vendedor_tipo; ALTER TABLE vendedor ADD PRIMARY KEY(v_datos.cod);
5
Inserción de un vendedor: INSERT INTO vendedor VALUES ('Norte', persona_tipo(234, XMLTYPE(' Emma 18 '), dir_tipo('Cl 56', 'Bogota') ) );
6
Otros dos vendedores: INSERT INTO vendedor VALUES ('Sur', persona_tipo(666, XMLTYPE(' Geri 20 '), dir_tipo('Cl 666', 'Cali'))); INSERT INTO vendedor VALUES ('Sur', persona_tipo(611, XMLTYPE(' Mel 50 ‘), dir_tipo('Cl 26', 'Bogota')));
7
Consultas: 1. Seleccionar el nombre, la dirección (dir) y el territorio de todos los vendedores: SELECT EXTRACTVALUE(v.v_datos.hv,'/Datos/Nom') AS nom, v.v_datos.p_dir.dir AS direc, v.territorio AS territ FROM vendedor v;
8
2. Seleccionar todos los datos personales de los vendedores de Bogotá. SELECT v.v_datos AS datos_personales FROM vendedor v WHERE v.v_datos.p_dir.ciudad = 'Bogota';
9
3. ¿Cuántos vendedores hay en cada ciudad y cuál es el total de sus salarios? SELECT v.v_datos.p_dir.ciudad AS city, COUNT(*) AS cuantos, SUM(EXTRACTVALUE(v.v_datos.hv,'/Datos/Sal')) AS s FROM vendedor v GROUP BY v.v_datos.p_dir.ciudad;
10
Supóngase que cada vendedor puede estar encargado de muchos clientes y un cliente debe ser manejado por un único vendedor: CLIENTE VENDEDOR °territorio v_datos #cod_cliente *nom El manager del cliente es un vendedor encargado de manejado por El identificador único es cod
11
¿Cómo se puede implementar CLIENTE?: - Una tabla con una columna tipada o - Crear un tipo y luego la tabla tipada Tipo de las columnas de CLIENTE: cod_cliente - cod_cliente Numérico nom - nom Cadena de caracteres manager - manager En el modelo relacional sería una clave foránea. En el modelo objeto-relacional es un REF.
12
Se va a crear un tipo cliente_tipo y luego una tabla tipada: CREATE TYPE cliente_tipo AS OBJECT( cod_cliente NUMBER(10), nom VARCHAR2(20), manager REF vendedor_tipo ); / CREATE TABLE cliente OF cliente_tipo( cod_cliente PRIMARY KEY, SCOPE FOR (manager) IS vendedor, manager NOT NULL); Puntero
13
¿Cómo se inserta un cliente? a) Mediante un INSERT basado en un SELECT: INSERT INTO cliente SELECT 129, 'Lisa', REF(v) FROM vendedor v WHERE v.v_datos.cod = 234; Obtiene el puntero del vendedor con cod 234
14
b) Mediante un INSERT con VALUES, el cual incluye un SELECT para obtener el REF:, INSERT INTO cliente VALUES (145,, 'Adam', (SELECT REF(v) FROM vendedor v WHERE v.v_datos.cod = 666 ) );, INSERT INTO cliente VALUES (111, 'George', (SELECT manager FROM cliente WHERE cod_cliente = 145) ); Otra forma de obtener el puntero de un vendedor O asignándole el de otro cliente
15
Consultas: 1. Imprimir el código de todos los clientes y todos los datos de su manager. SELECT * FROM cliente; SELECT cod_cliente AS codigo, DEREF(manager) AS datos_manager FROM cliente; Función de “dereferenciamiento“ En SQL*Plus no imprime los datos del manager, sino su puntero (en otros productos sí salen los datos)
16
2. Imprimir el código de cada cliente y el código de su manager: SELECT cod_cliente, DEREF(manager).v_datos.cod AS cod_manager FROM cliente c; --También funciona sin el DEREF: SELECT cod_cliente, c.manager.v_datos.cod AS cod_manager FROM cliente c;
17
DEREF fue concebido para “dereferenciar” todos los atributos de la tupla objeto referenciada Se puede acceder a cada atributo de una tupla referenciada con o sin DEREF En conclusión: DEREF es una forma más corta de traer todos los atributos de una tupla objeto referenciada
18
3. Imprimir el código de cada manager y el número de clientes que este maneja: SELECT c.manager.v_datos.cod AS cod_man, COUNT(*) AS representados FROM cliente c GROUP BY c.manager.v_datos.cod; --También se puede agrupar por el puntero: SELECT MAX(c.manager.v_datos.cod) AS codman, COUNT(*) AS representados FROM cliente c GROUP BY manager; --¿Por qué se requiere una función como MAX aquí?
19
Esta consulta también se puede resolver desde la tabla vendedor: SELECT v.v_datos.cod AS codman, (SELECT COUNT(*) FROM cliente WHERE manager = REF(v)) AS representados FROM vendedor v; Sin embargo, nótese que desde el punto de vista de resultados puede llegar a haber diferencias con la consulta anterior…
20
4. Imprimir el código de cada cliente, el nombre de su manager y su salario: SELECT cod_cliente, EXTRACTVALUE(c.manager.v_datos.hv,'/Datos/Nom') AS nom_man, EXTRACTVALUE(c.manager.v_datos.hv,'/Datos/Sal') AS sal_man FROM cliente c;
21
¿Qué hace esta consulta? SELECT v.v_datos.cod AS cod, (SELECT LISTAGG(cod_cliente||'@'|| nom,'-') WITHIN GROUP(ORDER BY cod_cliente) FROM cliente WHERE manager = REF(v)) FROM vendedor v;
22
Ejercicios: Imprimir la cédula de los vendedores que no manejan clientes. 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 usar claves foráneas. Imprimir el nombre de cada municipio y el nombre del departamento y el país al que pertenece el municipio.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.