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 Métodos Estáticos Un método estático no referencia a los atributos del tipo Su comportamiento está determinado por sus parámetros o por otros elementos (distintos de los atributos del tipo) La invocación de un método estático se hace con el tipo NO con una instancia de dicho tipo

3 Métodos Estáticos CREATE OR REPLACE TYPE matem_tip AS OBJECT (
cod VARCHAR(8), STATIC FUNCTION factorial(n IN NUMBER) RETURN NUMBER); / CREATE OR REPLACE TYPE BODY matem_tip AS STATIC FUNCTION factorial(n IN NUMBER) RETURN NUMBER IS BEGIN IF n = 0 THEN RETURN 1; ELSE RETURN n * factorial(n-1); END IF; END factorial; END; /

4 Invocación Desde una consulta. SELECT matem_tip.factorial(5)
FROM dual; Desde PL/SQL: BEGIN DBMS_OUTPUT.PUT_LINE(matem_tip.factorial(5)); END; / Nótese que es el tipo y no una instancia la que invoca al método estático

5 Métodos MAP y ORDER ¿Qué pasa si se comparan dos columnas tipadas (objetos) con un operador como >? Ej: empleado1 > empleado2 Este problema también se presenta en consultas que involucran objetos en una cláusula: ORDER BY objeto, GROUP BY objeto, DISTINCT objeto Para solucionar este problema se debe crear un método MAP u ORDER

6 Métodos MAP y ORDER Un tipo solo puede tener asociado uno de estos métodos Son métodos miembros, no estáticos MAP suele tener mejor desempeño (tiempo de ejecución) que ORDER pero puede ser menos flexible ¿En qué sentido?

7 Métodos MAP y ORDER No soportan parámetros adicionales a los preestablecidos  No se pueden sobrecargar Son invocados implícitamente por las operaciones que los requieren (ORDER, GROUP BY,DISTINCT, >, etc.) Se pueden invocar explícitamente Pueden generar confusión en una cláusula DISTINCT ya que “desaparecen” objetos que aparentemente son distintos  Ver ejemplos

8 Método MAP No tiene parámetros
Es una función que debe retornar un valor correspondiente a un tipo primitivo del sistema (no puede retornar objetos creados por el usuario)

9 Ejemplo DROP TYPE emp_type FORCE;
CREATE OR REPLACE TYPE emp_type AS OBJECT( cedula VARCHAR2(10), nombre VARCHAR2(10), edad NUMBER(2), salario NUMBER (6), MAP MEMBER FUNCTION ord_por_salario RETURN NUMBER ); / Tipo primitivo

10 Implementación CREATE OR REPLACE TYPE BODY emp_type AS
MAP MEMBER FUNCTION ord_por_salario RETURN NUMBER IS BEGIN RETURN salario; END ord_por_salario; END; /

11 DROP TABLE emp; CREATE TABLE emp OF emp_type (cedula PRIMARY KEY, salario NOT NULL); INSERT INTO emp VALUES('111', 'Bobaldo', 20, 100); INSERT INTO emp VALUES('121', 'Dawn', 30, 200); INSERT INTO emp VALUES('131', 'Lisa', 25, 80); INSERT INTO emp VALUES('141', 'Sidhe', 21, 100); INSERT INTO emp VALUES('151', 'Paddy', 21, 100); INSERT INTO emp VALUES('171', 'Edneud', 18, 50);

12 Ahora ya es posible: SELECT * FROM emp e ORDER BY VALUE(e);
CEDULA NOMBRE EDAD SALARIO Edneud Lisa Bobaldo Sidhe Paddy Dawn Si hay empates en el valor retornado por la función MAP, el orden entre los empatados es aleatorio Empate (100)

13 SELECT DISTINCT VALUE(e) FROM emp e;
Considérese la consulta: SELECT DISTINCT VALUE(e) FROM emp e; Resultado: VALUE(E)(CEDULA, NOMBRE, EDAD, SALARIO, COMISION) EMP_TYPE('171', 'Edneud', 18, 50) EMP_TYPE('131', 'Lisa', 25, 80) EMP_TYPE('111', 'Bobaldo', 20, 100) EMP_TYPE('121', 'Dawn', 30, 200) ¿Qué pasó con Sidhe y con Paddy?  Desaparición

14 Método ORDER Retorna un número (usualmente -1, 0, o 1)
Recibe como parámetro un objeto del mismo tipo al cual se le está creando la función ORDER En el método ORDER se comparan dos objetos (el objeto invocador y el que llega como parámetro) y se establece si el objeto invocador es <, = o > al objeto parámetro (y se retorna un número negativo, el cero o un número positivo, respectivamente) Cada objeto invocador se compara sucesivamente con todos los objetos que llegan como parámetro

15 Ejemplo DROP TYPE emp_type FORCE;
CREATE OR REPLACE TYPE emp_type AS OBJECT( cedula VARCHAR2(10), nombre VARCHAR2(10), edad NUMBER(2), salario NUMBER (6), ORDER MEMBER FUNCTION ord_por_salario(a IN emp_type) RETURN NUMBER ); /

16 Esta operación devolverá un número negativo, positivo o el cero
CREATE OR REPLACE TYPE BODY emp_type AS ORDER MEMBER FUNCTION ord_por_salario(a IN emp_type) RETURN NUMBER IS BEGIN RETURN (salario - a.salario); END ord_por_salario; END; / Volver a crear la tabla emp, insertarle datos y ensayar las dos consultas… Esta operación devolverá un número negativo, positivo o el cero

17 SELECT VALUE(e), COUNT(*) AS cuantos FROM emp e GROUP BY VALUE(e);
VALUE(e)(CEDULA, NOMBRE, EDAD, SALARIO) CUANTOS EMP_TYPE('171', 'Edneud', 18, 50) 1 EMP_TYPE('131', 'Lisa', 25, 80) 1 EMP_TYPE('111', 'Bobaldo', 20, 100) 3 EMP_TYPE('121', 'Dawn', 30, 200) 1

18 Vistas objeto Considere el siguiente modelo E-R FACTURA compuesta de
#código fecha compuesta de DETALLE #pdto *cant de

19 Implementación relacional:
CREATE TABLE factura( codigo NUMBER(8) PRIMARY KEY, fecha DATE); CREATE TABLE detalle( pdto VARCHAR2(20), codfac NUMBER(8) REFERENCES factura, PRIMARY KEY(pdto, codfac), cant NUMBER(8) NOT NULL CHECK (cant > 0) );

20 INSERT INTO factura VALUES(1, SYSDATE);
INSERT INTO detalle VALUES('Leche’, 1, 100); INSERT INTO detalle VALUES('Cerdo’, 1, 5); INSERT INTO detalle VALUES('Cerdo’, 2, 10); Convertir este modelo a objeto relacional sin migrar los datos  Crear una capa virtual  Vistas objeto

21 Procedimiento Crear los tipos para las vistas objeto deseadas:
DROP TYPE fac_type FORCE; CREATE TYPE fac_type AS OBJECT( codigo NUMBER(8), fecha DATE); /

22 DROP TYPE det_type FORCE;
CREATE TYPE det_type AS OBJECT( pdto VARCHAR2(20), codfac NUMBER(8), cant NUMBER(8), fac_ref REF fac_type ); /

23 Se crean las vistas objeto: CREATE OR REPLACE VIEW fobj OF fac_type
WITH OBJECT OID(codigo) AS SELECT * FROM factura; Campo en la vista, se corresponde con el campo codigo de la tabla factura

24 CREATE OR REPLACE VIEW detobj OF det_type WITH OBJECT OID(pdto,codfac) AS SELECT pdto, codfac, cant, MAKE_REF(fobj, codfac) FROM detalle; Campos en la vista, se corresponden con (pdto y codfac) en la tabla detalle Para cada valor de codfac se obtiene un puntero desde la vista fobj

25 Sintaxis: MAKE_REF(view_name, value_list) Donde: view_name: Vista objeto de la cual se desea derivar el REF value_list: Lista de valores, separados por comas, los cuales se deben acoplar con los atributos que conforman el OID de la vista view_name.

26 Ya se puede trabajar con las vistas
objetos como si fueran tablas objetuales: SELECT * FROM fobj; SELECT d.codfac, d.pdto, d.fac_ref.fecha fec FROM detobj d; INSERT INTO detobj(pdto, codfac, cant) VALUES('Gallina’, 2, 1000); Incluso se pueden insertar datos a través de la vista. Los datos quedan en las tablas base (originales):

27 Ejercicio Agregar métodos a los tipos fac_type y det_type y verificar que se pueden llamar desde las vistas objeto.


Descargar ppt "Características Objeto Relacionales en Oracle"

Presentaciones similares


Anuncios Google