Crear Procedimiento Almacenado en DB2 con parametros de salida y resultset, luego consumirlo desde Java.
No soy un partidario de utilizar Procedimientos Almacenados (Stored Procedures), pero cuando se trabaja con empresas externas, aunque duela, hay que aprender.
Actualmente en el proyecto que estoy trabajando debia crear un procedimiento almacenado “dummy” en DB2 que retornara un parametro de salida y adicionalmente un resultset, esto me pareció bastante curioso ya que los SP no estan concebidos para eso. De todas maneras esto se puede hacer y leyendo la documentación de IBM DB2 encontré la respuesta.
Crear el procedimiento
Para poder retornar un resultset, primero debemos tener una tabla y en este caso le llamaremos “MITABLA”. Luego crearemos un procedimiento almacenado que devuelva un parametro de salida y el resultset.
El código del procedimiento
Aquí la clave es declarar el cursor con “with return”
CREATE PROCEDURE "MIESQUEMA".SP_CON_RESULTSET(
OUT CODIGO varchar(20))
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN
--DECLARAMOS EL CURSOR PARA EL RESULTSET
DECLARE C1 CURSOR WITH RETURN FOR SELECT * FROM MITABLA;
--SETEAMOS EL PARAMETRO DE SALIDA
SET CODIGO = '1313';
OPEN C1;
RETURN;
END
Consumir SP desde Java
Hay dos formas de obtener el resultset, la primera es utilizar el método executeQuery() que retorna el resultset y la segunda es la mencionada a continuación, utilizar execute() y luego getResultSet()
public void callSP(){
ResultSet result = null;
CallableStatement cstmt = null;
try {
String procName = "MIESQUEMA.SP_CON_RESULTSET";
//concatenamos
String sql_ = "CALL " + procName + "(?)";
cstmt = con.prepareCall(sql_);
//Registramos el parametro de salida y el tipo de dato
cstmt.registerOutParameter( 1, Types.CHAR);
//Realizando la llamada
cstmt.execute();
//Obtenemos el parametro de salida
String codigoSalida = cstmt.getString(1);
//Obtenemos el resultset
result = (ResultSet) cstmt.getResultSet();
while (result.next()) {
//Aquí iteramos sobre el resultset
}
} catch (SQLException e) {
//En caso de un excepción
}
}
Wordpress Syntax Highlighter pérdida de los tabs o indentación (Solución)
Hay un problema bastante molestoso al pegar código de muestra en wodpress y es la perdida de las tabulaciones al copiar y pegar código a wordpress.
La solución
Es simple, basta con reemplazar cada tab (tabulación) por 4 espacios, estéticamente quedará igual y no se perderá al pegar a wordpress.
Si utilizas eclipse puedes transformar tu tab a 4 espacios de la siguiente manera:
Preferences>Java>formatter>Edit
En tab policy dejamos solo en “Spaces Only” y en indent size en “4″
Empezar con Google App Engine (JAVA)
Mucha gente huye de Java y no precisamente por la inherente dificultad de aprender este lenguaje, la mayoría lo hace simplemente porque les complica configurar un ambiente de desarrollo y ademas no existen muchas alternativas de alojamiento como en PHP, pero todo esto puede cambiar si aprendemos a utilizar Google App Engine.
![google_appengine[1]_2 google_appengine[1]_2](http://blog.pontt.com/wp-content/uploads/2009/08/google_appengine1_2.png)
Google App Engine es un servicio de Google bajo el concepto de cloud computing en el cual no nos preocupamos del servidor de aplicaciones ni tampoco de donde alojaremos nuestra data. Lo único que necesitamos para empezar es bajar el SDK, escribir código, compilar y luego realizar el anhelado deploy.
Utilizar getJSON(jQuery) con Java(Struts) crossdomain.

Hace poco en un proyecto tuve que integrar información entre un html y un servlet (struts), tenia que ser con AJAX mediante un html generado con un javascript incrustado en cualquier dominio, claramente no es posible utilizar AJAX si el html esta en un dominio distinto al servidor que envía la respuesta, pero se puede hacer algo similiar.
¿Que hacer?
Existe una libreria llamada JSONP que permite incrustar archivos javascript despues de haber cargado la página y justamente es lo que utiliza la función $.getJSON() de jQuery.
¿Como generar un JSON “leible” por $.getJSON()?
Primero que nada, para consumir un JSON remoto debemos enviar el parametro jsoncallback y con valor “?”, despues en struts lo concatenamos a la respuesta que generemos. Es importante hacer esto ya que de otra forma no funcionará.
Por ejemplo si el JSON generado es:
{"nombre":"andres","edad":24}
La respuesta en struts debe quedar así.
?({"nombre":"andres","edad":24})
Por lo tanto, desde el lado del cliente debemos llamar de la siguiente manera al action de struts.
$.getJSON("http://10.10.20.101:8080/proyecto/controller.do?action=obtenerJson&jsoncallback=?",
function(data){}
//Imprimimos nombre
alert(data.nombre);
);
Del lado del servidor generamos así la respuesta
public ActionForward obtenerJson(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//Guardamos en una variable el JSON
String json = "{\"nombre\":\"Andres\",\"edad\":\"24\"}";
//Capturamos el parametro
String callback = request.getParameter("jsoncallback");
//Concatenamos la respuesta y dejamos entre parentesis la respuesta
String jsonOutput = callback + "(" + json + ")";
//Enviamos al jsp
request.setAttribute("variable",jsonOutput);
return mapping.findForward(forward);
}