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
}
}
¿Que diferencia hay entre hacer esto
instruccion.registerOutParameter(1,java.sql.Types.INTEGER);
y esto otro
instruccion.registerOutParameter(1,OracleTypes.INTEGER );
?