Estoy utilizando las clases JdbcTemplate y StoredProcedure de Spring. Tengo problemas para que la clase de procedimiento almacenado funcione para mí.Procedimiento almacenado de Spring: los resultados que vuelven del procedimiento siempre están vacíos
Tengo un procedimiento almacenado en una base de datos de Oracle. Su firma es
CREATE OR REPLACE PROCEDURE PRC_GET_USERS_BY_SECTION
(user_cursor OUT Pkg_Types.cursor_type
, section_option_in IN Varchar2
, section_in IN Varchar2) AS ....
donde
TYPE cursor_type IS REF CURSOR;
tengo a crear la siguiente clase de procedimiento almacenado para obtener información del procedimiento de Oracle
private class MyStoredProcedure extends StoredProcedure
{
public MyStoredProcedure(JdbcTemplate argJdbcTemplate)
{
super(argJdbcTemplate, "PRC_GET_USERS_BY_SECTION");
declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR));
declareParameter(new SqlParameter("input1", Types.VARCHAR));
declareParameter(new SqlParameter("input2", Types.VARCHAR));
compile();
}
public Map<String, Object> execute() {
Map<String, Object> inParams = new HashMap<String, Object>();
inParams.put("input1", "BG");
inParams.put("input2", "FE");
Map output = execute(inParams);
return output;
}
}
Estoy llamando a esto en un método en una de mis clases DAO
public List<String> getUserListFromProcedure() throws BatchManagerException
{
MyStoredProcedure sp = new MyStoredProcedure(this.jdbcTemplate);
Map<String, Object> result = new HashMap<String, Object>();
try
{
result = sp.execute();
}
catch(DataAccessException dae)
{
}
System.out.println(result.size());
return null;
}
Sin embargo, el tamaño del mapa siempre es 0, por lo que no se produce ningún problema. Sé que hay filas en la base de datos que coinciden con mis criterios de entrada. También tuve código de trabajo que usaba java.sql.CallableStatement
para interactuar con el proceso almacenado de Oracle, por lo que el proceso es bueno. ¿Es incorrecto mezclar OraceleTypes.CURSOR
con Spring's Stored Procedure? ¿Qué más puedo usar? También probé SqlReturnResultSet
y eso tampoco funcionó.
Hola, gracias por su comentario. Lo tengo trabajando con mi procedimiento almacenado de Oracle. El problema fue con el parámetro de salida que había declarado. Los siguientes trabajos declareParameter (new SqlOutParameter ("output", oracle.jdbc.OracleTypes.CURSOR, new RowMapper() {public String mapRow (ResultSet argResults, int argRowNum) arroja SQLException {return argResults.getString (1);}})); Esto está funcionando para mí ahora. Gracias – aos
Debería haber respondido su propia pregunta y haberla seleccionado como la respuesta aceptada. Gracias por publicar de todos modos. –