domingo, 18 de mayo de 2014

DBOR ordenar y comparar objetos en SQL

Para poder ordenar o comparar objetos en Sql se utilizan las claves "MAP" y "ORDER".

Oracle es incapaz de deducir si un objeto es mayor que otro, por lo tanto , es necesario implementar una de estas funciones (solo se puede implementar una o la otra, no ambas a la vez)

MAP, nos sirve para comparar objetos y es llamado automaticamente cuando en un  SELECT  se utiliza DISTINCT, ORDER BY  y GROUP BY.

Ejemplo, creamos un objeto "melonT":

CREATE OR REPLACE TYPE melonT AS  OBJECT
(
id_melon number(2);
nombre  varchar2(20);
MAP MEMBER FUNCTION id_melon  RETURN NUMBER;  /*cabecera del metodo 'id_melon  ' */
);

/* creamos el metodo 'id_melon  ' */

CREATE OR REPLACE TYPE BODY melonT   AS
      MAP MEMBER FUNCTION id_melon  RETURN NUMBER
      BEGIN
            RETURN id_melon;   /*return: un atributo que sea clave primaria */
      END;
END;
----------------------------------------------------

ORDER , a diferencia de MAP  , solo puede comparar la diferencia entre  2 objetos y la sintaxis es más estricta. El resultado de "ORDER"  tiene que ser un valor que se pueda comparar (un tipo primitivo), el retorno de la función es la resta del valor del propio objeto menos el valor del objeto pasado por parametro, es decir, si la salida es cero los dos objetos son son iguales, si la salida es negativa el objeto que es comparado es más pequeño y si la salida es positiva el objeto a comparar es mayor el objeto con el que se compara.


Ejemplo :

CREATE OR REPLACE TYPE melonT AS  OBJECT
(
id_melon number(2);
nombre  varchar2(20);
ORDER MEMBER FUNCTION equals(otroObj   IN  melonT ) RETURN INTEGER;  /*cabecera del metodo 'equals' */
);

CREATE OR REPLACE TYPE BODY melonT   AS
      MAP MEMBER FUNCTION equals(otroObj   IN  melonT )  RETURN INTEGER
      BEGIN
            RETURN  id_melon -  ortroObj.id_melon;
      END;
END;










No hay comentarios:

Publicar un comentario