Comportamiento group by en oracle 10g

Recientemente me han actualizado la versión de la base de datos 10g. Me llevé una gran sorpresa al ver que las consultas con GROUP BY ya no estaban ordenadas por los mismos campos de la cláusula. He programado en Oracle 8 y 9 y siempre había dado por hecho que, salvo que necesitara uno distinto, el orden sería el mismo que el del GROUP BY. He leído en un blog que Oracle ha cambido la estrategia de ordenación por defecto en la 10g. Ahora es HASH GROUP BY y comentan que tiene un bug que se resuelve en la 11g. En el blog dicen que oracle recomienda (en las versiones con el bug) poner el parámetro _gby_hash_aggregation_enabled parameter a FALSE o optimizer_features_enabled a 9.2.0.
Sin embargo, leyendo la nota 345048.1 ‘Group By’ Does Not Sort If You Don’T Use Order By In 10g lo que entiendo es que no es un bug. Sencillamente es un efecto colateral del algoritmo de agrupación (antiguo) lo que hacía que salieran ordenadas. Nunca ha habido garantías de ordenación. Por tanto toca poner order by a todas las consultas con group by lo que puede conllevar unas cuantas horas de divertida revisión del código.

Campos null con precisión en vistas

Muchas veces he necesitado crear una vista para sustituir una antigua tabla. En ocasiones he tenido que mantener en la vista una columna que ya no existe pero que debo dejar por algún motivo. Lo que hago es definir la columna como “Función(NULL) AS NOMBRE_COLUMNA”. Si es VARCHAR2 pongo directamente NULL. Si quiero que sea un number TO_NUMBER(NULL) y si es una fecha TO_DATE(NULL). Por ejemplo:

CREATE OR REPLACE VIEW CAMPOS_NULOS AS(
  SELECT NULL              AS CADENA_VACIA,
         TO_NUMBER( NULL ) AS NUMERO_VACIO,
         TO_DATE( NULL )   AS FECHA_VACIA
  FROM DUAL )
/

Si hacemos un desc:

SQL> DESC CAMPOS_NULOS
 Nombre        ¿Nulo?   Tipo
 ------------- -------- ----------------------------
 CADENA_VACIA           VARCHAR2
 NUMERO_VACIO           NUMBER
 FECHA_VACIA            DATE

El único problema, como puede verse en el ejemplo, es que perdía la precisión. Sigue leyendo