Una era construye ciudades. Una hora las destruye.
Séneca

Archivos en el mes de January del 2008

[Java] – JSmooth

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.

[Java] – Redigir la salida desde Java

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();

}

[JDBC] – Recuperar campos de dos tablas diferentes

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");

[JDBC] – UNION de datos tipo LONG

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.

[Lecturas Recomendadas] – 20080121

  1. La red turística medieval, iniciativa turística que integra municipios con un rico patrimonio medieval.
  2. Windows Vista, un año después, desde luego no comparto el punto 1, y añadiría tres puntos: querer hacer "EL PRODUCTO" (en informática todos sabemos que eso es imposible) sin aprovechar su gran experiencia previa en la saga Windows; no ofrecer un producto que sirva al usuario sino un producto que funcione a pesar del usuario (espiando todas sus acciones); y decepcionar totalmente (el "wow" que hicimos los usuarios fue de decepción, no de asombro).
  3. Provisiones, provisiones y más provisiones, beneficios, beneficios y más beneficios para el futuro, aún hay esperanza.
  4. Finanzas: el arte de llegar a fin de mes, un buen momento para leer este post.
  5. Simulación para mejorar los procesos, la ciencia avanza incluso en áreas tan oscuras como el software.
Comenta