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

标签 java jdbc sybase

我正在调用一个通过 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/

相关文章:

java - 使用 JDBC 以 SYS_REFCURSOR 作为 IN 参数调用 PL/SQL 过程

java - 在 EJB 上下文中从 DataSource 调用过程时出现 "Stored procedure ' xxx ' may be run only in unchained transaction mode."错误

sql - sybase:如果可能的话,我如何删除所有表和存储过程?

java - 如何解决在 Oracle XE 中使用 Java 6 程序时遇到的 UnsatisfiedLinkError?

java - 使用 java 从具有私有(private)子网的 ec2 实例访问 amazon Dynamodb

java - BouncyCaSTLe 1.51 在 Wildfly 8.0 上加载

java - 如何将 JVM 汇编代码编译成字节码?

java - 甲骨文 JDBC 瘦 : enforce network encryption

java - 如何从我的 servlet 类访问放在/tmp 文件夹中的 sqlite 数据库文件?