Documente Academic
Documente Profesional
Documente Cultură
Objeto Relacionales
en Oracle
Francisco Moreno
Universidad Nacional
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
Métodos Estáticos
CREATE OR REPLACE CREATE OR REPLACE
TYPE TYPE BODY matem_tip AS
matem_tip AS OBJECT STATIC FUNCTION
( factorial(n IN NUMBER)
cod VARCHAR(8), RETURN NUMBER IS
STATIC FUNCTION BEGIN
factorial(n IN NUMBER) IF n = 0 THEN RETURN 1;
RETURN NUMBER); ELSE RETURN
/ n * factorial(n-1);
END IF;
END factorial;
END;
/
Invocación
Desde una consulta.
SELECT matem_tip.factorial(5)
Nótese que es el
FROM dual; tipo y no una
instancia la que
Desde PL/SQL: invoca al método
estático
BEGIN
DBMS_OUTPUT.PUT_LINE(matem_tip.factorial(5));
END;
/
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
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?
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
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)
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
);
/
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;
/
DROP TABLE emp;
CREATE TABLE emp OF emp_type
(cedula PRIMARY KEY, salario NOT NULL);
SELECT *
FROM emp e
ORDER BY VALUE(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)
END;
/
FACTURA compuesta
de DETALLE
#código
#pdto
fecha de *cant
Implementación relacional:
MAKE_REF(view_name, value_list)
Donde: