martes, 9 de junio de 2009

Oracle Functions Decode y Sign

Estas funciones son bastante útiles cuando se necesita seleccionar un valor u otro dependiendo de cierta condición.
La función Decode trabaja como un IF-THEN-ELSE o como un IF-THEN-ELSEIF-ELSEIF-...-ELSE. Su sintaxis es:
decode( expression , search , result [, search , result]... [, default] )
En los parámetros, expression es el valor que queremos comparar y cada par search-result, funciona como un if, es decir, IF search THEN result. Mejor escribo un ejemplo:
SELECT decode( codigo_empresa, 100, 'Yahoo!', 200, 'Google', 300, 'Sun') FROM empresa;
Esto es como si hicieramos algo como:
if ( codigo_empresa == 100 ){
  echo 'Yahoo!';
}
else if( codigo_empresa == 200 ) {
  echo 'Google';
}
else if( codigo_empresa == 300 ) {
  echo 'Sun';
}
La función Sign nos devuelve un valor para indicar si un número es positivo, negativo o cero (0). Ejemplos:
SELECT sign(-5) from dual;   -- Devuelve -1
SELECT sign(1000) from dual;   -- Devuelve 1
SELECT sign(0) from dual;   -- Devuelve 0
SELECT sign(0.0001) from dual;   -- Devuelve 1
Ahora, cómo usar juntas estas funciones para obtener un gran provecho? Supongamos que tenemos dos tablas con estructuras similares, donde manejamos unos valores para diario, semanal y mensual. En una de las tablas manejamos los detalles y en la otra manejamos los "topes" máximos que se van a obtener al consultar.
SELECT
decode( sign( det.diario - tope.diario ), -1, det.diario, 0, det.diario, tope.diario ) AS diario
decode( sign( det.semanal - tope.semanal ), -1, det.semanal, 0, det.semanal, tope.semanal ) AS semanal
decode( sign( det.mensual - tope.mensual ), -1, det.mensual, 0, det.mensual, tope.mensual ) AS mensual
FROM detalle det, tope;
Este query nos va a traer el valor más bajo de las columnas diario, semanal y mensual entre la tabla Detalle y la tabla Tope.

viernes, 5 de junio de 2009

Control de cache en conexiones seguras

Hace poco me salía el siguiente error cuando descargaba un archivo por medio de un servlet desde un sitio seguro a través de Internet Explorer.



Extrañamente, en Firefox este error no se presentaba.
Después de buscar un rato (creo que fue más de un rato) a qué se debía el error, encontré que el problema parece ser un bug de IE (que raro!) y se genera por el uso de una etiqueta que había puesto en el encabezado de la respuesta. La etiqueta que yo tenía es:

Pragma: null

Internet Explorer tiene problemas con este encabezado cuando el sitio es seguro. La solución fue demasiado sencilla, eliminar la etiqueta en cuestión y utilizar la siguiente:

Cache-Control: private

En mi caso puse las cabeceras así :
response.setHeader("Cache-Control", "private");
response.setHeader("Pragma", null);
response.setHeader("Expires", null);
Y ahora sí funciona.