Đây là thứ tôi tổng hợp lại dựa trên câu hỏi về StackOverflow này và tài liệu 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;
}
}
Nếu thủ tục được lưu trữ của bạn nằm trong một lược đồ khác hoặc trong một gói, bạn sẽ cần điều chỉnh tên thủ tục được lưu trữ ở trên. Ngoài ra, bạn sẽ cần chỉ định một trình liên kết hàng để sử dụng thay cho SomeRowMapper
.
Để gọi nó:
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
Ngoài ra, bạn có thể sử dụng 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");
Nếu quy trình được lưu trữ nằm trong một gói, bạn sẽ cần thêm một dòng
.withCatalogName("PACKAGE_NAME")
để thiết lập jdbcCall
. Tương tự, nếu nó nằm trong một giản đồ khác, bạn sẽ cần thêm
.withSchemaName("SCHEMA_NAME")