通过JDBC调用时,Sybase存储过程结果集为空通过JDBC调用时,Sybase存储过程结果集为空

2019-05-12 07:59发布

我打电话一个Sybase存储过程使用JDBC返回多个结果。 我需要有一个名为列中的特定结果集“结果”这是我的代码:

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

有没有人遇到这样?

Answer 1:

你是曲解的返回值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”



文章来源: Null resultsets when calling Sybase stored procedure through JDBC
标签: java jdbc sybase