我正在调用一个Sybase存储过程,它通过JDBC返回多个结果集。 我需要获得一个具有名为“Result”的列的特定结果集 这是我的代码:
CallableStatement cs = conn.prepareCall(sqlCall);
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
ResultSet rs=null;
int count = 1;
boolean flag = true;
while (count < 20000 && flag == true) {
cs.getMoreResults();
rs = cs.getResultSet();
if (rs != null) {
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int columnsCount = resultSetMetaData.getColumnCount();
if (resultSetMetaData.getColumnName(1).equals("Result")) {
// action code resultset found
flag = false;
// loop on the resultset and add the elements returned to an array list
while (rs.next()) {
int x = 1;
while (x <= columnsCount) {
result.add(rs.getString(x));
x++;
}
}
result.add(0, cs.getString(1));
}
}
count++;
}
这里发生的是cs.getMoreResults
返回大量空结果集,直到达到目标结果集。我不能使用cs.getMoreResults
作为循环条件,因为它为null结果集返回false。
我输入一个固定数字来结束循环,条件是没有返回想要的结果集以防止它进入无限循环。它工作正常,但我不认为这是对的。
我认为从Sybase select @variable = value
以前有人遇到过这个问题吗?
答案 0 :(得分:7)
您误解了getMoreResults()
的返回值。您也忽略了execute()
的返回值,此方法返回boolean
,表示第一个结果的类型:
true
:结果为ResultSet
false
:结果是更新计数如果结果为true
,则您使用getResultSet()
检索ResultSet
,否则getUpdateCount()
检索更新计数。如果更新计数为-1
,则表示没有更多结果。请注意,当前结果为-1
时,更新计数也为ResultSet
。如果没有更多结果或者结果是更新计数(这最后一个条件是为什么你得到这么多getResultSet()
值),那么null
应该返回null也是一件好事。
现在,如果您想要检索更多结果,请致电getMoreResults()
(或其兄弟接受int
参数)。 boolean
的返回值与execute()
的返回值相同,因此false
并不意味着没有更多结果!
如果getMoreResults()
返回false并且getUpdateCount()
返回-1
(也在Javadoc中记录),则只会有更多结果
基本上这意味着如果您想要正确处理所有结果,您需要执行以下操作:
boolean result = stmt.execute(...);
while(true) {
if (result) {
ResultSet rs = stmt.getResultSet();
// Do something with resultset ...
} else {
int updateCount = stmt.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// Do something with update count ...
}
result = stmt.getMoreResults();
}
我的猜测是,在获得实际ResultSet
之前,您会获得大量更新计数。
我对Sybase并不熟悉,但如果你没有在存储过程的开头明确地放置SET NOCOUNT ON;
,那么它的堂兄SQL Server就有“烦人”的功能来从存储过程返回更新计数。 / p>
注意:此答案的部分内容基于我对Execute “sp_msforeachdb” in a Java application
的回答