java调用存储过程同时获取[返回参数]和[结果集]

本文详细解析了在使用JDBC执行存储过程时遇到的输出参数未处理导致的错误,并提供了修正方法。通过修改代码,确保在查询执行后正确处理输出参数,避免了Output parameters have not yet been processed的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:http://blog.youkuaiyun.com/security08/article/details/5148586

执行以下代码,报错:

String querySQL = "{?=call p_sys_manager_csReport(?,?,?,?,?)}";
cstmt = conn.prepareCall(querySQL);
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setInt(2, modType);
cstmt.setInt(3, dptId);
cstmt.setInt(4, eplId);
cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
rs = cstmt.executeQuery();
if (rs != null) {
	if (rs.next()) {
			companyTotal = rs.getInt("companyTotal");
	}
}
String temp = null;
temp = cstmt.getString(5);//此行报错

报错信息为:

java.sql.SQLException: Output parameters have not yet been processed. Call getMoreResults().
    at net.sourceforge.jtds.jdbc.ParamInfo.getOutValue(ParamInfo.java:159)
    at net.sourceforge.jtds.jdbc.JtdsCallableStatement.getOutputValue(JtdsCallableStatement.java:116)
    at net.sourceforge.jtds.jdbc.JtdsCallableStatement.getString(JtdsCallableStatement.java:310)

报错信息说得很明白,就是输出结果参数未处理,必须调用getMoreResults()方法以判断是否还有结果集。

然后修改代码,问题解决:

String querySQL = "{?=call p_sys_manager_csReport(?,?,?,?,?)}";
cstmt = conn.prepareCall(querySQL);
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setInt(2, modType);
cstmt.setInt(3, dptId);
cstmt.setInt(4, eplId);
cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
rs = cstmt.executeQuery();
if (rs != null) {
	if(rs.next()) {
			companyTotal = rs.getInt("companyTotal");
	}
}
String temp = null;
/*
 *记录集获取到后,把rs记录集循环取出后或者调用cstmt.getMoreResults()方法后,sqlserver才会处理output返回值
*/
if (!cstmt.getMoreResults()) {//此行判断是否还有更多的结果集,如果没有,接下来会处理output返回参数了
	temp = cstmt.getString(5);//此行不再报错
}

其中改为以下代码也不报错:

if (rs != null) {
	while(rs.next()) {//if改为while
			companyTotal = rs.getInt("companyTotal");
	}
}
String temp = null;
/*
 * 去掉cstmt.getMoreResults(),将上面的if(rs.next()) 改为while(rs.next())也不报错
*/
//if (!cstmt.getMoreResults()) {
	temp = cstmt.getString(5);//此行不再报错
//}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值