24 de January del 2008

JSmooth es un proyecto sourceforge que crea un programa ejecutable en Windows (.exe) a partir de un fichero Java .jar. Además es capaz de encontrar cualquier JVM instalada en el ordenador; en el caso no encontrar descargará e instalará automáticamente una versión de JVM adecuada.
24 de January del 2008
Antes del maravailloso invento del Log4J, teníamos los problemas de almacenar las trazas generadas desde un programa Java.
Para ello podíamos utilizar al Sistema Operativo redirigiendo la salida como cualquier otro programa que se ejecute en el SO, con los operadores “>” y “>>”.
Para hacerlo desde Java, podemos utilizar el siguiente código:
private String nombreFicheroLog = “cargaInformes.log”;
try {
PrintStream ps = new PrintStream(
new BufferedOutputStream(new FileOutputStream(
new File(nombreFicheroLog))), true);
System.setOut(ps);
System.setErr(ps);
System.out.println(“DEBUG – Log configurado en “ + nombreFicheroLog);
} catch (Exception e) {
System.out.println(“WARNING – Fichero log no configurado, las trazas saldrán por consola”);
e.printStackTrace();
}
23 de January del 2008
Queremos realizar una consulta de los datos contenidos en dos tablas diferentes. Para ello podemos utilizar una sentencia SQL del siguiente estilo:
SELECT *
FROM SOLICITUDES s, ENTIDADES e
WHERE s.COD_ESTADO = 2
AND e.COD_ENTIDAD = s.COD_ENTIDAD
Ahora la duda es, cómo recuperar los datos ?
Si las columnas de las dos tienen nombres distintos pues no hay mayor problema, lo hacemos igual que si la consulta fuese a una única tabla:
rs.getInt("COD_SOLICITUD");
La duda surge si las dos tablas tienen dos columnas con el mismo nombre. En el ejemplo ambas tablas tienen una columna COD_ENTIDAD (aunque los valores de los resultados son iguales por la condición del AND). Desgraciadamente, el código no funciona con los alias, es decir:
rs.getInt("e.COD_ENTIDAD");
No lo interpreta como "alias.columna" sino como "columna", y por tanto da un error porque la columna no existe.
Si ejecutamos la sentencia SQL en MySQL (o en Oracle…), nos fijamos en las columnas del resultado y encontraremos "COD_ENTIDAD" y "COD_ENTIDAD_1", con lo cual ya podemos acceder a la tabla que queramos.
rs.getInt("COD_ENTIDAD");
rs.getInt("COD_ENTIDAD_1");
23 de January del 2008
La sentencia siguiente
(SELECT a.texto FROM…) UNION (SELECT a.texto FROM…)
si el campo "a.texto" es de tipo LONG da el error siguiente:
ORA-00997: uso no válido del tipo de dato LONG
Este error se reproduce si el campo en cuestión es de tipo LOB, CLOB…
La razón es porque el comando "UNION" busca los resultados de una consulta en la otra para no duplicar los resultados, y al realizar comparaciones entre campos LONG (LOB, CLOB…) da un error.
La solución puede ser utilizar "UNION ALL", que no realiza esta comprobación y por tanto puede dar resultados duplicados.