Características ObjetoRelacionales en Oracle *
* Tomado del curso de Francisco Moreno
03/10/2015
Seminario de Bases de Datos
1
Tipos
CREATE TYPE nom_tipo AS OBJECT(
atributos...
métodos...
) [cláusula de instanciabilidad]*
[cláusula de herencia]** ;
/
* Valor por defecto INSTANTIABLE
** Ojo: El valor por defecto es FINAL
03/10/2015
Seminario de Bases de Datos
2
Ejemplo:
DROP TYPE location_typ FORCE;
CREATE TYPE location_typ AS OBJECT(
address VARCHAR2(20),
city VARCHAR2 (20),
country VARCHAR2 (20)
);
/
03/10/2015
Seminario de Bases de Datos
3
CREATE TABLE area(
id NUMBER(3) PRIMARY KEY,
name VARCHAR2(10),
location location_typ
);
INSERT INTO area
VALUES(29, 'Prog',
location_typ('Cl 20','Med','Col'));
¡Sin NEW!
03/10/2015
Seminario de Bases de Datos
4
Selección:
SELECT name, location
FROM area;
SELECT name, location.country
FROM area;
¡No funciona!
03/10/2015
Seminario de Bases de Datos
5
Se requiere alias para accesar los atributos
contenidos en un tipo:


SELECT name, a.location.country
FROM area a;
SELECT name, location
FROM area a
WHERE a.location.address like '%Cl%';
03/10/2015
Seminario de Bases de Datos
6
INSERT INTO area VALUES(13, 'Ventas',
location_typ('Cl 20','Med','Col'));
INSERT INTO area VALUES (35, 'Mercadeo',
location_typ('Cr Sta Fe', 'Car', 'Ven'));
INSERT INTO area VALUES (99, 'Public',
location_typ('Cl 20','Med','Col'));
Ejercicio: Seleccionar el código de los dptos que tienen la
misma localización que el dpto 13 (es decir que posean el
mismo país, ciudad y dir)
03/10/2015
Seminario de Bases de Datos
7
Primera forma
SELECT id
FROM area a1
WHERE a1.location.country = ( SELECT a2.location.country
FROM area a2 WHERE id=13)
AND a1.location.city = ( SELECT a2.location.city
FROM area a2 WHERE id=13)
AND a1.location.address = ( SELECT a2.location.address
FROM area a2 WHERE id=13);

Es incómodo…pero se puede mejorar…
03/10/2015
Seminario de Bases de Datos
8
Segunda forma
SELECT id
FROM area a1
WHERE(a1.location.country, a1.location.city,
a1.location.address)=(SELECT a2.location.country,
a2.location.city,
a2.location.address
FROM area a2
WHERE id = 13);
Ha mejorado un poco…pero es posible mejorarlo más…
03/10/2015
Seminario de Bases de Datos
9
Tercera forma
SELECT id
FROM area
WHERE location = ( SELECT location
FROM area
WHERE id = 13);
Ejercicio:
Imprimir todas las parejas de códigos de
los departamentos que están situados en la
misma localización.
03/10/2015
Seminario de Bases de Datos
10
Solución:
SELECT a.id, b.id
FROM area a, area b
WHERE a.location=b.location
AND a.id < b.id;
¿Qué pasa con esta consulta? :
SELECT location, count(*)
FROM area
GROUP BY location;
03/10/2015
Seminario de Bases de Datos
11
Algunos trucos:
Se mostrarán las instrucciones para lograr
que un atributo que está dentro de un
tipo:
A) Tenga un índice
B) Sea obligatorio
C) Sea o haga parte de la clave primaria de la
tabla
D) Sea o haga parte de una clave alternativa
03/10/2015
Seminario de Bases de Datos
12
A)
CREATE INDEX index_ciudad ON area(location.city);
B)
DROP TABLE area;
CREATE TABLE area
(id NUMBER(3) PRIMARY KEY,
name VARCHAR2(10),
location location_typ CHECK(location.country IS NOT NULL)
);
03/10/2015
Seminario de Bases de Datos
13
C)
ALTER TABLE area DROP PRIMARY KEY;
*
ALTER TABLE area ADD
PRIMARY KEY(location.country); Si ya hay países
D)
ALTER TABLE area
ADD UNIQUE(location.address);
repetidos no se
activará…
* La opción MODIFY no funciona en este caso.
03/10/2015
Seminario de Bases de Datos
14
¿Qué hacen las siguientes instrucciones?
CREATE TABLE employee(
code number(8) PRIMARY KEY,
working_country VARCHAR(15)
);
ALTER TABLE employee ADD
FOREIGN KEY(working_country) REFERENCES
area(location.country);
¿Qué característica debe cumplir el atributo country de
localización en la tabla área?
03/10/2015
Seminario de Bases de Datos
15
Sea el tipo:
CREATE TYPE audit_type AS OBJECT(
quien VARCHAR(20), cuando DATE, donde VARCHAR(10)
);
/
Sean las tablas:
CREATE TABLE local_movers(
old_country VARCHAR(20),
audit_data audit_type
);
03/10/2015
CREATE TABLE inter_movers(
city VARCHAR(20),
audit_data audit_type
);
Seminario de Bases de Datos
16
Descubra que realiza el siguiente trigger:
1.
2.
3.
4.
Destruya las tablas employee y area
Cree de nuevo la tabla area (ver diapositiva 4).
Inserte las 4 filas dadas (diapositivas 4 y 7)
Cree el trigger de la siguiente diapositiva:
03/10/2015
Seminario de Bases de Datos
17
CREATE OR REPLACE TRIGGER movimientos
BEFORE UPDATE OF location ON area
FOR EACH ROW
BEGIN
IF ((:OLD.location.country = 'Col') AND
(:NEW.location.country <> 'Col')) THEN
INSERT INTO inter_movers
VALUES(:OLD.location.city, audit_type(
USER, SYSDATE, USERENV('TERMINAL')));
ELSE IF ((:OLD.location.country <> 'Col') AND
(:NEW.location.country= 'Col')) THEN
INSERT INTO local_movers
VALUES(:OLD.location.country, audit_type(
USER, SYSDATE, USERENV('TERMINAL')));
END IF;
END IF;
END;
/
03/10/2015
Seminario de Bases de Datos
18
5. Ejecute el siguiente UPDATE:
UPDATE area a
SET a.location=location_typ('#7#','Pekín','China')
WHERE id=13;
6. Mire qué pasa en las tablas local e inter movers
Ejercicio:
Modificar las tablas de local e inter_movers de tal forma
que incluyan el código del area (id).
03/10/2015
Seminario de Bases de Datos
19
Descargar

La parte objeto relacional en Oracle 10G