Saltar la navegación

5.- Métodos MAP y ORDER.

Caso práctico

Fotografía de Juan.
Ministerio de Educación. (Uso Educativo nc)



Juan se ha dado cuenta de que va a tener un problema cuando necesite realizar comparaciones y órdenes entre objetos del mismo tipo.

Cuando tenga una serie de objetos de tipo Usuario, y necesite realizar una operación de ordenación entre ellos, ¿cómo debe hacerlo? Podría indicar que se realizaran las consultas de forma ordenada en función de alguno de los atributos del tipo de objeto. Ha estudiado el funcionamiento de los métodos MAP y ORDER, y ha comprobado que son los que le van a ofrecer un mecanismo sencillo para ello.

Las instancias de un tipo de objeto no tienen un orden predefinido. Si deseas establecer un orden en ellos, con el fin de hacer una ordenación o una comparación, debes crear un método MAP.

Por ejemplo, si haces una comparación entre dos objetos Usuario, y deseas saber si uno es mayor que otro, ¿en base a qué criterio se hace esa comparación? ¿Por el orden alfabético de apellidos y nombre? ¿Por la fecha de alta? ¿Por el crédito? Hay que establecer con un método MAP cuál va a ser el valor que se va a utilizar en las comparaciones.

Para crear un método MAP debes declarar un método que retorne el valor que se va a utilizar para hacer las comparaciones. El método que declares para ello debe empezar su declaración con la palabra MAP:

CREATE OR REPLACE TYPE Usuario AS OBJECT (
	login VARCHAR2(30),
	nombre VARCHAR2(30),
	apellidos VARCHAR2(40),
	f_ingreso DATE,
	credito NUMBER,
	MAP MEMBER FUNCTION ordenarUsuario RETURN VARCHAR2
);
/

En el cuerpo del método se debe retornar el valor que se utilizará para realizar las comparaciones entre las instancias del tipo de objeto. Por ejemplo, si se quiere establecer que las comparaciones entre objetos del tipo Usuario se realice considerando el orden alfabético habitual de apellidos y nombre:

CREATE OR REPLACE TYPE BODY Usuario AS
	MAP MEMBER FUNCTION ordenarUsuario RETURN VARCHAR2 IS
	BEGIN
		RETURN (apellidos || ' ' || nombre);
	END ordenarUsuario;
END;
/

El lenguaje PL/SQL utiliza los métodos MAP para evaluar expresiones lógicas que resultan valores booleanos como objeto1 > objeto2, y para realizar las comparaciones implícitas en las cláusulas DISTINCT, GROUP BY y ORDER BY.

Cada tipo de objeto sólo puede tener un método MAP declarado, y sólo puede retornar alguno de los siguientes tipos: DATE, NUMBER, VARCHAR2, CHARACTER o REAL.

Aquí (pdf - 7,74 KB)puedes descargarte un PDF con el código completo de un ejemplo de declaración y uso de un método MAP para establecer el orden en las comparaciones entre dos instancias de objetos del tipo Usuario. Como puedes comprobar, las comparaciones se realizan un función del orden alfabético de los apellidos seguidos del nombre.

Ejercicio Resuelto

Partimos de un tipo direccion_t definido para guardar datos de una dirección:

 CREATE or replace TYPE direccion_t  AS OBJECT (
	 calle VARCHAR2(200), 
	 ciudad VARCHAR2(200), 
	 prov CHAR(2), 
	 codpos VARCHAR2(20)
 );

Sea cliente_t  un tipo definido para guardar información de un cliente, que contiene dos métodos, uno para calcular la edad de un cliente y otro sería el que contiene el MAP:

create or replace TYPE cliente_t AS OBJECT ( 
     clinum NUMBER, 
     clinomb VARCHAR2(200), 
     direccion direccion_t, 
     telefono VARCHAR2(20), 
     fecha_nac DATE, 
     MEMBER FUNCTION edad RETURN NUMBER,
     MAP MEMBER FUNCTION ret_value RETURN NUMBER
  );

Escribe el código correspondiente a los métodos edad y ret_value que ordenará por el campo clinum. Es decir cuando se comparen dos objetos del tipo cliente_t se compararán por su atributo clinum.