Saltar la navegación

5.1.- Métodos ORDER.

De forma similar al método MAP, puedes declarar en cualquier tipo de objeto un método ORDER que te permitirá establecer un orden entre los objetos instanciados de dicho tipo.

Cada tipo de objeto sólo puede contener un método ORDER, el cual debe retornar un valor numérico que permita establecer el orden entre los objetos. Si deseas que un objeto sea menor que otro puedes retornar, por ejemplo, el valor -1. Si vas a determinar que sean iguales, devuelve 0, y si va a ser mayor, retorna 1. De esta manera, considerando el valor retornado por el método ORDER, se puede establecer si un objeto es menor, igual o mayor que otro en el momento de hacer una ordenación entre una serie de objetos del mismo tipo.

Para declarar qué método va a realizar esta operación, debes indicar la palabra ORDER delante de su declaración. Debes tener en cuenta que va a retornar un valor numérico (INTEGER), y que necesita que se indique un parámetro que será del mismo tipo de objeto. El objeto que se indique en ese parámetro será el que se compare con el objeto que utilice este método.

En el siguiente ejemplo, el sistema que se va a establecer para ordenar a los usuarios se realiza en función de los dígitos que se encuentran a partir de la posición 7 del atributo login.

CREATE OR REPLACE TYPE BODY Usuario AS
	ORDER MEMBER FUNCTION ordenUsuario(u Usuario) RETURN INTEGER IS
	BEGIN
		/* La función substr obtiene una subcadena desde la posición indicada hasta el final*/
		IF substr(SELF.login, 7) < substr(u.login, 7) THEN
			RETURN -1;
		ELSIF substr(SELF.login, 7) > substr(u.login, 7) THEN
			RETURN 1;
		ELSE
			RETURN 0;
		END IF;
	END;
END;

Con ese ejemplo, el usuario con login 'luitom64' se considera mayor que el usuario 'caragu62', ya que '64' es mayor que '62'.

El método debe retornar un número negativo, cero, o un número positivo que significará que el objeto que utiliza el método (SELF) es menor, igual, o mayor que el objeto pasado por parámetro.

Debes tener en cuenta que puedes declarar un método MAP o un método ORDER, pero no los dos.

Cuando se vaya a ordenar o mezclar un alto número de objetos, es preferible usar un método MAP, ya que en esos casos un método ORDER es menos eficiente.

Aquí (pdf - 7,55 KB) puedes descargar  el  código completo de un ejemplo de declaración y uso de un método ORDER para establecer el orden entre objetos del tipo Usuario. Como puedes comprobar, las comparaciones se realizan un función de los dos últimos dígitos del atributo login.

Autoevaluación

Pregunta

¿Los métodos MAP sólo sirven para evaluar expresiones lógicas que resultan valores booleanos?

Respuestas

Verdadero.

Falso.

Retroalimentación

Ejercicio Resuelto

Siguiendo el ejemplo del apartado anterior,  tipo cliente_t quedaría:

CREATE or replace TYPE cliente_t AS OBJECT ( 
    clinum NUMBER, 
    clinomb VARCHAR2(200), 
    direccion direccion_t, 
    telefono VARCHAR2(20), 
    fecha_nac DATE, 
    ORDER MEMBER FUNCTION cli_ordenados (x cliente_t) RETURN INTEGER,
    MEMBER FUNCTION edad RETURN NUMBER);

Implementa el método cli_ordenados.