Blog de Programación y Diseño Web

Crear Procedimiento Almacenado en DB2 con parametros de salida y resultset, luego consumirlo desde Java.

Escrito en General by Andres on the Agosto 31st, 2009

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)

Escrito en wordpress by Andres on the Agosto 31st, 2009

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)

Escrito en Java by Andres on the Agosto 25th, 2009

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 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.

(más…)

Utilizar getJSON(jQuery) con Java(Struts) crossdomain.

Escrito en Json con Java by Andres on the Agosto 24th, 2009

getJSON

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);
    }
Switch to our mobile site