Hier ist etwas, das ich basierend auf diese StackOverflow-Frage und die Spring-Dokumentation :
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;
}
}
Wenn sich Ihre gespeicherte Prozedur in einem anderen Schema oder in einem Paket befindet, müssen Sie den Namen der gespeicherten Prozedur oben anpassen. Außerdem müssen Sie einen Zeilenzuordner angeben, der anstelle von SomeRowMapper
verwendet werden soll .
Um es zu nennen:
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
Alternativ können Sie einen SimpleJdbcCall
verwenden :
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");
Wenn sich die gespeicherte Prozedur in einem Paket befindet, müssen Sie eine Zeile hinzufügen
.withCatalogName("PACKAGE_NAME")
zum Setup von jdbcCall
. Wenn es sich in einem anderen Schema befindet, müssen Sie entsprechend hinzufügen
.withSchemaName("SCHEMA_NAME")