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

}

}

1 comment on this post.

  1. Andres:

    ¿Que diferencia hay entre hacer esto
    instruccion.registerOutParameter(1,java.sql.Types.INTEGER);
    y esto otro
    instruccion.registerOutParameter(1,OracleTypes.INTEGER );
    ?

Leave a comment