La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Características Objeto Relacionales en Oracle

Presentaciones similares


Presentación del tema: "Características Objeto Relacionales en Oracle"— Transcripción de la presentación:

1 Características Objeto Relacionales en Oracle
Francisco Moreno Universidad Nacional

2 Colecciones: VARRAYS (Variable ARRAYs)
En la intersección de una fila y de una columna se puede tener un arreglo (colección de elementos indexados). En Oracle se denomina VARRAY Todos los elementos del VARRAY son del mismo tipo de datos Al igual que las tablas anidadas sus elementos pertenecen a un tipo de datos: - Primitivo - Definido por el usuario: puede ser incluso el de otro VARRAY (VARRAY de VARRAYs)

3 VARRAYS El total de elementos del VARRAY no puede sobrepasar el tamaño definido Los VARRAYs se pueden considerar como tablas anidadas limitadas (soportan un número limitado de elementos) Al igual que para las tablas anidadas, se debe definir el tipo para el VARRAY

4 Modelo Entidad Relación
Ejemplo Modelo Entidad Relación conformado por DPTO # código * nombre * conmutador EMPLEADO # cédula * nombre adscrito a

5 VARRAYs A continuación se crea una tabla de departamentos y a cada departamento se le colocará un VARRAY de REFs correspondiente a los empleados que trabajan en dicho dpto, es decir, un VARRAY de punteros.

6 Gráficamente: código nombre conmutador mis_emps 11 Ventas 2103 20
Note que el empleado con puntero 543 trabaja en dos dptos. DPTO código nombre conmutador mis_emps 11 Ventas 2103 20 Cont. 2132 38 Aseo 3390 Vacío FE2 AE1 BC1 543 43E 543 EMP cédula nombre oid 10 Ana FE2 Punteros 20 Beto AE1 40 Rolli 43E 90 Lalo BC1 80 Sara 543

7 Implementación Se crea el tipo y la tabla para los empleados:
DROP TYPE emp_tip FORCE; CREATE OR REPLACE TYPE emp_tip AS OBJECT( cedula NUMBER(8), nombre VARCHAR2(15) ); / DROP TABLE EMPLEADO; CREATE TABLE empleado OF emp_tip (cedula PRIMARY KEY);

8 INSERT INTO empleado VALUES(10,'Ana');
INSERT INTO empleado VALUES(20,'Beto'); INSERT INTO empleado VALUES(40,'Rolli'); INSERT INTO empleado VALUES(90,'Lalo'); INSERT INTO empleado VALUES(80,'Sara'); Ahora se crea un tipo VARRAY de 10 posiciones. Cada posición guarda el puntero de un empleado: DROP TYPE emp_varray FORCE; CREATE OR REPLACE TYPE emp_varray AS VARRAY(10)OF REF emp_tip; /

9 Se crea la tabla de departamentos: cada departamento
tiene su VARRAY de punteros a empleados: DROP TYPE dep_tip FORCE; CREATE TYPE dep_tip AS OBJECT( codigo NUMBER(3), nombre VARCHAR2(10), conmutador NUMBER(10), mis_emps emp_varray); / DROP TABLE dep; CREATE TABLE dep OF dep_tip(codigo PRIMARY KEY, mis_emps NOT NULL);

10 Se insertan los datos del dpto 11: INSERT INTO dep VALUES (11, 'Ventas', 2103, emp_varray((SELECT REF(e) FROM empleado e WHERE cedula = 10), (SELECT REF(e) FROM empleado e WHERE cedula = 20), WHERE cedula = 90), WHERE cedula = 80) ) );

11 Se insertan los datos de los dptos 20 y 38: INSERT INTO dep VALUES
(20, 'Cont', 2132, emp_varray((SELECT REF(e) FROM empleado e WHERE cedula = 40), (SELECT REF(e) FROM empleado e WHERE cedula = 80) ) ); (38, 'Aseo', 3390, emp_varray() Array vacío (no es equivalente a array NULL)

12 Selección La siguiente consulta imprime cada dpto con el REF* de sus empleados: SELECT * FROM dep; Para imprimir cada dpto junto con los datos de cada uno de sus empleados se procede así: * Nota: algunos productos imprimen los datos de los empleados en vez de su puntero.

13 Acá también surge la columna: COLUMN_VALUE:
SELECT nombre, e.COLUMN_VALUE FROM dep, TABLE(mis_emps) e; SELECT nombre, DEREF(e.COLUMN_VALUE)

14 SELECT nombre, e.COLUMN_VALUE.cedula AS ced FROM dep, TABLE(mis_emps) e; O también: DEREF(e.COLUMN_VALUE).cedula AS ced

15 Poco soporte en el SQL de Oracle para
inserción, actualización o borrado de los elementos de un VARRAY. Para estas operaciones se recomienda usar PL/SQL. Veamos un ejemplo: Inserción de un empleado en un departamento. Se crea un procedimiento:

16 CREATE OR REPLACE PROCEDURE
Cédula del empleado Código del dpto CREATE OR REPLACE PROCEDURE insemp(midep IN NUMBER, miemp IN NUMBER) AS varr emp_varray; /* Se declara un VARRAY de punteros a empleados */ refmiemp REF emp_tip; -- Puntero a un empleado BEGIN /*Se obtiene el VARRAY de empleados del dpto enviado: */ SELECT mis_emps INTO varr FROM dep WHERE codigo = midep; Continúa…

17 /*Se comprueba que no se está en el límite del VARRAY*/
IF varr.COUNT = varr.LIMIT THEN RAISE_APPLICATION_ERROR(-20564, 'No hay sitio para otro emp. en el dpto ' || midep); END IF; --Se obtiene el REF del empleado enviado SELECT REF(e) INTO refmiemp FROM empleado e WHERE cedula = miemp; Continúa…

18 --Comprobar que el emp. no esté repetido
FOR contador IN 1..varr.COUNT LOOP IF varr(contador) = refmiemp THEN RAISE_APPLICATION_ERROR(-20764, 'El emp ' || miemp || ' ya trabaja en el dpto ' || midep); END IF; END LOOP; Nótese como se accede a un elemento del VARRAY. Continúa…

19 --Prepara el VARRAY para un nuevo elemento
varr.EXTEND; --Activa la celda y le pone un null varr(varr.COUNT) := refmiemp; --Asigna el elemento --¡Actualizar en la base de datos! UPDATE dep SET mis_emps = varr WHERE codigo = midep; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20111,'Dato no existe'); END; / Nota: si se hace un EXTEND y el VARRAY está lleno, genera error: ORA-06532: Subscript outside of limit

20 Nota: Recordar que en PL/SQL una tabla anidada se puede manipular igual que un VARRAY.
Los atributos EXTEND, COUNT, DELETE y otros también funcionan con tablas anidadas en PL/SQL. Invocación del procedimiento: EXECUTE insemp(38,40); EXECUTE insemp(38,80);

21 Agregar al tipo emp_tip un método que devuelva un VARRAY con los punteros de los departamentos en los que trabaja cada empleado. DROP TYPE dep_varray FORCE; CREATE OR REPLACE TYPE dep_varray AS VARRAY(10) OF REF dep_tip; / ALTER TYPE emp_tip ADD MEMBER FUNCTION mis_deps RETURN dep_varray CASCADE;

22 CREATE OR REPLACE TYPE BODY emp_tip AS MEMBER FUNCTION mis_deps RETURN dep_varray IS mi_ref REF emp_tip; v_deps dep_varray := dep_varray(); BEGIN --Se obtiene el REF del empleado que invoca al método SELECT REF(e) INTO mi_ref FROM empleado e WHERE e.cedula = SELF.cedula; Continúa…

23 FOR mi_d IN (SELECT mis_emps,REF(d) AS dref FROM dep d) LOOP --Ver si el empleado está en el varray FOR i IN 1..mi_d.mis_emps.COUNT LOOP IF mi_d.mis_emps(i) = mi_ref THEN v_deps.EXTEND; v_deps(v_deps.COUNT) := mi_d.dref; EXIT; --Sale del ciclo interno END IF; END LOOP; RETURN v_deps; END; / Como siempre se deben controlar posibles excepciones…

24 Ahora se puede ejecutar:
SELECT e.cedula, e.mis_deps() FROM empleado e; SELECT e.cedula, t.COLUMN_VALUE.codigo AS cod FROM empleado e, TABLE(e.mis_deps()) t; SELECT e.cedula, DEREF(t.COLUMN_VALUE)

25 Una alternativa es redundar datos y colocarle a cada empleado su VARRAY de REFs de departamentos donde trabaja Se debe evaluar si se justifica hacerlo: analizar aspectos de almacenamiento, consistencia, velocidad, mantenimiento de código, entre otros. En conclusión, ver cuales son las prioridades y procurar un balance…

26 Tablas anidadas Vs. VARRAYs
Almacenadas out of line Se columnas se pueden indexar* No limitadas en número de elementos Soporte “directo” en SQL para INSERT, DELETE y UPDATE de filas de la tabla anidada Apropiadas para grandes conjuntos de elementos Almacenados in-line (si < 4k) No soportan índices Limitados en el número de elementos  aunque se puede ampliar Se recomienda PL/SQL para insertar, borrar y actualizar elementos del varray Útiles para conjuntos “pequeños” y que posean un límite conocido y estable  su tiempo de respuesta es “bueno” * Ejemplo. CREATE INDEX nest_prod ON store_detalles(id_producto); Ver la presentación de tablas anidadas.

27 Ejercicios Crear un procedimiento que elimine un empleado de un dpto.
Imprimir el código de todos los departamentos que tienen el mismo conjunto de empleados que el dpto 20. Agregar al tipo emp_tip un método que devuelva un VARRAY con los codigos (no los punteros) de los departamentos en los que trabaja cada empleado.


Descargar ppt "Características Objeto Relacionales en Oracle"

Presentaciones similares


Anuncios Google