我正在使用spring jdbc。我希望结果集没有param。我分开完成了但是我无法做到。
CREATE DEFINER=`xxx`@`%` PROCEDURE `client_xxxx`(
IN p_xxxx TINYINT(1) UNSIGNED,
IN p_result SMALLINT(2) UNSIGNED,
OUT p_result BIT ) BEGIN
IF EXISTS(SELECT 1 FROM xxx WHERE xxx = 1 AND xxx = 1) THEN
SELECT ...;
SET p_result = 0;
ELSE
SELECT ...;
SET p_result = 1;
END IF;
END
spring jdbc code
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName(sp);
List<Map<String, Object>> list = (List<Map<String, Object>>) jdbcCall.execute(paramsArray).get("#result-set-1");
list
获取带有结果集的结果集如何才能获得p_result
。
答案 0 :(得分:0)
我以简单的方式找到它,我想念。
public Map<String, Object> xxx(String sp, Object... paramsArray) {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName(sp);
return jdbcCall.execute(paramsArray);
}
execute()
默认提供两个参数
即
1)#results-set-1
2)#update-count-1
#result-set-1
结果集即select record
并且#update-count-1
返回更新计数。如果我们想要使用带有select
参数的out
语句来访问结果。我们只需声明out
参数。 execute()
以Map<String, Object>
类型提供所有内容。
因此,从地图中我们可以获得stored procedure
返回的所有多个值。
例如我的SP
喜欢
PROCEDURE xxx(
IN xxxxTINYINT(1) UNSIGNED,
IN xxxSMALLINT(2) UNSIGNED,
OUT p_isconfig BIT
)
BEGIN
SELECT....
SET p_isconfig = 1;
END
所以在#result-set-1
我得到了选择结果。
并且p_isconfig
给了我结果。如果您有任何困惑,那么您可以迭代地图并确定如何获得返回参数。
Iterator i = map.keySet().iterator();
while ( i.hasNext() ) {
String key = (String) i.next();
String value = params.get( key );
System.out.println("key: " + key + " --- value: " + value) ;
}
这样我在读完很多东西后找到了解决方法。如果任何人有此解决方案的其他选项,请与我分享。
答案 1 :(得分:0)
您可以尝试morejdbc(在maven central中使用)来调用您的过程,它更简洁而且类型安全:
import static org.morejdbc.SqlTypes.BIGINT;
import static org.morejdbc.NamedJdbcCall.call;
import org.morejdbc.*;
...
private JdbcTemplate jdbcTemplate;
...
Out<Integer> out = Out.of(INTEGER);
jdbcTemplate.execute(call("client_xxxx")
.in("p_xxxx", pValue)
.out("p_result", out));
System.out.println("Result is " + out.get());
对于ref_cursor
out参数和Oracle数据库,您可以使用
Out<List<Record>> out = Out.of(OracleSqlTypes.cursor((rs, idx) -> new Record(rs)));
jdbcTemplate.execute(call("client_xxxx")
.in("p_xxxx", pValue)
.out("p_result", out)); // will auto-close ref-cursor
System.out.println("Got result records: " + out.get());