Tengo un procedimiento almacenado que tiene un cuerpo como: -
PROCEDURE PROC_NAME(param1 in varchar2,param2 in varchar2,results_cursor OUT CURSOR_TYPE);
Cada fila de resultado es equivalente a una instancia de una determinada clase definida por el usuario.
¿Cómo puedo llamar a esto en primavera. Revisé mucho google y stackoverflow pero no pude encontrar una respuesta adecuada.
¿Puede alguien por favor darme una solución a esto. Gracias por adelantado.
Aquí hay algo que armé basado en esta pregunta de StackOverflow y la documentación de Spring :
import java.sql.Types; import java.util.HashMap; import java.util.Map; import javax.sql.DataSource; import oracle.jdbc.OracleTypes; import org.springframework.jdbc.core.SqlOutParameter; import org.springframework.jdbc.core.SqlParameter; import org.springframework.jdbc.object.StoredProcedure; public class SampleStoredProcedure extends StoredProcedure { public SampleStoredProcedure(DataSource dataSource) { super(dataSource, "PROC_NAME"); declareParameter(new SqlParameter("param1", Types.VARCHAR)); declareParameter(new SqlParameter("param2", Types.VARCHAR)); declareParameter(new SqlOutParameter("results_cursor", OracleTypes.CURSOR, new SomeRowMapper())); compile(); } public Map<String, Object> execute(String param1, String param2) { Map<String, Object> inParams = new HashMap<>(); inParams.put("param1", param1); inParams.put("param2", param2); Map output = execute(inParams); return output; } } Si su procedimiento almacenado está en otro esquema o en un paquete, deberá ajustar el nombre del procedimiento almacenado en lo anterior. Además, deberá especificar un mapeador de filas para usar en lugar de SomeRowMapper .
Para llamarlo:
DataSource dataSource = ... ; // get this from somewhere SampleStoredProcedure sp = new SampleStoredProcedure(dataSource); Map<String, Object> result = sp.execute("some string", "some other string"); // Do something with 'result': in particular, result.get("results_cursor") // will be the list of objects returned Alternativamente, puede usar un SimpleJdbcCall :
DataSource dataSource = ... ; // get this from somewhere SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource); Map<String, Object> result = jdbcCall.withProcedureName("PROC_NAME") .declareParameters( new SqlParameter("param1", Types.VARCHAR), new SqlParameter("param2", Types.VARCHAR), new SqlOutParameter("results_cursor", OracleTypes.CURSOR, new SomeRowMapper())) .execute("some string", "some other string");Si el procedimiento almacenado está en un paquete, deberá agregar una línea
.withCatalogName("PACKAGE_NAME") a la configuración de jdbcCall . Del mismo modo, si está en un esquema diferente, deberá agregar
.withSchemaName("SCHEMA_NAME")Por favor, eche un vistazo una vez. Lista de datos de usuario;
SimpleJdbcCall executor = new SimpleJdbcCall(jdbcTemplate) .withProcedureName("SP_CL_USERPKS_FOLDER").withoutProcedureColumnMetaDataAccess() .declareParameters( new SqlParameter("INparam1", Types.INTEGER), new SqlParameter("INparam2", Types.VARCHAR), new SqlOutParameter("OUTParam1", OracleTypes.CURSOR), new SqlOutParameter("OUTParam2", OracleTypes.VARCHAR)); executor.compile(); SqlParameterSource param = new MapSqlParameterSource() .addValue("INparam1", loginPk) .addValue("INparam2", email); Map map = executor.execute(param); userData = (List<Map>) map.get("OUTParam1"); String msg = (String) map.get("OUTParam2");