5

我正在调用通过 JDBC 返回多个结果集的 Sybase 存储过程。我需要获得一个特定的结果集,其中有一个名为“结果”的列这是我的代码:

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

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

4

1 回答 1

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

注意:此答案的一部分基于我对在 Java 应用程序中执行“sp_msforeachdb”的回答

于 2013-02-12T09:35:48.337 回答