¿Cómo obtener el valor máximo de diferentes columnas en una consulta SQL de Oracle?
SELECT name, MAX(date1)
FROM usuarios GROUP BY name;
Obtendríamos la 'date1' más reciente para el 'usuario' identificado con 'name'.
Pero que pasa si lo que queremos es obtener el valor máximo de diferentes fechas de un mismo usuario? Para ello tenemos la función GREATEST():
SELECT name, GREATEST(date1, date2)
FROM usuarios;
El problema viene cuando una de las fechas es NULL. Todas las funciones de Oracle devuelven NULL cuando alguno de sus parámetros lo es. Así que si no nos interesa esto, para el ejemplo anterior podríamos inventarnos una fecha ficticia y usar NVL():
SELECT name, GREATEST(nvl(date1,dateX), nvl(date2,dateX))
FROM usuarios;
Si suponemos que dateX es más antigua que cualquier date1 o date2, con esto evitamos que nos devuelva NULL si alguna de ellas lo es. Si las 2 son NULL, nos devolverá dateX. Si queremos mantener el resultado NULL en este caso, se me ocurre añadir el uso de DECODE():
SELECT name,
DECODE(
GREATEST(nvl(date1,dateX), nvl(date2,dateX)),
dateX,
NULL,
GREATEST(nvl(date1,dateX), nvl(date2,dateX))
)
FROM usuarios;
Cuando el resultado del GREATEST sea dateX, o es que dateX es la más reciente de todas las fechas (no debería) o es que todas son NULL. Así que en este caso devolvemos NULL con el DECODE.
Parece un poco rebuscado y para 2 fechas se puede combinar con otras funciones Oracle, por ejemplo con COALESCE(), pero cuando te encuentras con N columnas, esto me ha parecido lo más sencillo...
Oracle BEA Customer Welcome Briefing
Este evento ha sido toda una oportunidad para...
...conocer la nueva estrategia de negocio y los productos por los que apuestan, tales como el antiguo WebLogic Server de Bea; y de los que no, como el WebLogicPortal de Bea que se sustituye por el WebCenter de Oracle.
...conocer a Madrid por mi parte y descubrir que en los bares te sirven tapas que no has pedido y que no te piensan cobrar!
Una vez más Raona está consciente en la evolución de las nuevas tecnologias, para apostar por las tecnologias con futuro.
JOUTU instalar Oracle 10g in Fedora 8
Una vez descargado y desempaquetado el paquete de Oracle, realicé las acciones previas para preparar el SO (se encuentra en la carpeta DOC del paquete en cuestión). Y cuando llegó el momento de arrancar el instalador, entendí porqué en producción usaban un Red Hat 8.
1. Compatibilidad del SO
Debemos engañar al instalador para ignorar que estamos usando un Fedora y no un Red Hat:
./runInstaller –ignoreSysPrereqs
2. Requisitos de las librerías
Si por desgracia seguimos sin ver la pantalla anterior por problemas de librerías, en mi caso fue la libXp.so.6, con Fedora lo solucionaríamos haciendo lo siguiente en una consola como root:
yum whatprovides libXp.so.6
Y después instalaríamos los paquetes que nos muestre el comando anterior:
yum install nombreDelPaquete
Para los no amantes de la consola, podéis usar yumex (lo podéis instalar ejecutando yum install yumex).
3. Arrancar el instalador en modo gráfico
Puede que el instalador no pueda arrancar en modo gráfico. En consola deberías estar cómo el usuario ‘oracle’, cambiando a ‘root’ y ejecutar:
xhost +localhost
4. Importación de una BD
Para restaurar una BD a partir de un fichero .dmp, ejecutamos por consola con el usuario oracle:
imp full=Y file=filename log=logfile
Para más info:
http://www.infor.uva.es/~jvegas/cursos/bd/oraback/oraback.html
5. Arrancar la BD Oracle
Cuando ya todo parece funcionar y llevas tiempo trabajando con la BD, en algún momento tienes la sensación de que algo va mal, ya no nos podemos conectar a la BD pero el servidor Linux sigue en marcha, ¿qué pasa?
Sistemas reinició el servidor en algún momento y el motor Oracle no arranca por sí solito con el SO… Pues nada, hay que ejecutar esto:
export ORACLE_HOME=/home/XXXX/oracle/product/10.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=XXXX
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
sqlplus /nolog
connect / as sysdba
startup
exit
lsnrctl start
isqlplusctl start
emctl start dbconsole
Espero que este 'joutu' saque de apuros a otros como yo!