gpt4 book ai didi

java - 通过 JDBC 调用 Sybase 存储过程时出现空结果集

转载 作者:行者123 更新时间:2023-12-03 22:55:59 24 4
gpt4 key购买 nike

我正在调用一个通过 JDBC 返回多个结果集的 Sybase 存储过程。我需要获得一个特定的结果集,其中有一列名为“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 用作循环条件,因为它会为空结果集返回 false。

我在没有返回想要的结果集的情况下放置一个固定数字来结束循环,以防止它进入无限循环。它运行良好,但我认为这是不对的。

我认为从 Sybase select @variable = value 中的赋值返回的空结果集

有没有人遇到过这个问题?

最佳答案

您误解了 getMoreResults() 的返回值。您还忽略了 execute() 的返回值,此方法返回一个 boolean 指示第一个结果的类型:

  • true:结果是一个 ResultSet
  • false : 结果是更新计数

如果结果为 true,则使用 getResultSet()检索 ResultSet,否则 getUpdateCount()检索更新计数。如果更新计数为 -1,则表示没有更多结果。请注意,当当前结果为 ResultSet 时,更新计数也将为 -1。如果没有更多结果或者结果是更新计数,getResultSet() 应该返回 null 也是一件好事(这最后一个条件就是为什么你得到这么多 null 值)。

现在,如果您想检索更多结果,请调用 getMoreResults() (或者它的兄弟接受一个 int 参数)。 boolean的返回值和execute()的意义相同,所以false 不代表没有更多的结果!

只有当 getMoreResults() 返回 false 并且 getUpdateCount() 返回 -1 时,才会没有更多结果(同样记录在Java文档)

从本质上讲,这意味着如果您想要正确处理所有结果,您需要执行如下操作:

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 不是很熟悉,但它的堂兄 SQL Server 有一个“烦人”的功能,如果你没有明确地把 SET NOCOUNT ON; 放在开头,它会从存储过程返回更新计数存储过程。

注意:部分答案基于我对 Execute “sp_msforeachdb” in a Java application 的回答

关于java - 通过 JDBC 调用 Sybase 存储过程时出现空结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25934155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com