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.