Hier ist etwas, das ich zusammen basierend auf this StackOverflow question und the Spring documentation:
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 Ihre gespeicherte Prozedur in einem anderen Schema oder in einem Paket ist, müssen Sie den Namen der gespeicherten Prozedur in der oben anzupassen. Außerdem müssen Sie einen Zeilenmapper angeben, der anstelle von SomeRowMapper
verwendet wird.
es 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 eine SimpleJdbcCall
verwenden können:
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 die gespeicherte Prozedur in einem Paket ist, müssen Sie eine Zeile hinzufügen
.withCatalogName("PACKAGE_NAME")
zum Setup von jdbcCall
. Und falls es in einem anderen Schema ist, müssen Sie hinzufügen
.withSchemaName("SCHEMA_NAME")
Ich bin nicht sicher, wie es mit JdbcTemplate zu tun, aber ich habe es mit Klar JDBC getan. Ich kann Code schreiben, wenn Sie JDBC verwenden können. –
@dsp_user: Ich kann JDBC nicht in meinem Code verwenden. –
Nun, JDBCTemplate verwendet es bereits intern, aber es liegt wirklich an Ihnen. –