Stored procedures 在执行存储过程或函数时,是否有方法提前确定要返回的结果集的数量?

Stored procedures 在执行存储过程或函数时,是否有方法提前确定要返回的结果集的数量?,stored-procedures,jdbc,Stored Procedures,Jdbc,让我们假设JDBC中的以下虚拟示例: Statement statement = connection.createStatement(); statement.execute("call sp1(); select * from X;"); int uc = statement .getUpdateCount(); boolean isResult = (uc == -1); do { if( isResult )

让我们假设JDBC中的以下虚拟示例:

   Statement statement = connection.createStatement();
   statement.execute("call sp1(); select * from X;");
   
   int uc = statement .getUpdateCount();
   boolean isResult = (uc == -1);

   do
   {
      if( isResult )
      {
         ResultSet rs = statement.getResultSet();

         if( rs != null )
         {
            doSomethingWithRS( rs );
         }
      }
      else
      {
         System.out.println( "update count: " + uc );
      }
   }
   while( ( isResult = statement.getMoreResults() ) || ( uc = statement.getUpdateCount() ) != -1 );
众所周知,某些数据库/驱动程序允许执行多个语句(例如SQL Server)。 对于程序员来说,存储过程的细节不一定是事先知道的。

是否有一种方法可以提前确定存储过程调用返回的结果集的数量,以便能够将它们与为后续SELECT返回的结果集区分开来?

否,JDBC中没有任何东西允许您提前知道,通常,在底层数据库系统中甚至没有一个选项可以知道这一点。例如,在SQL Server中,完全可以编写一个存储过程,根据其输入(包括它访问的表、环境配置等)输出零、一或几十个结果集(以及更新计数)。如果不亲自执行,这样的事情是不可判定的

您唯一能做的就是正确解释
execute()
getMoreResults()
getUpdateCount()
getResultSet()
的结果,或者不编写可能有多个或动态结果的存储过程

另外,初始代码不应调用
getUpdateCount()
来决定它是否为结果集,它应使用
execute()
的返回值:

boolean isResultSet=statement.execute(“调用sp1();从X中选择*”;
while(true){
if(isResultset){
//不需要空检查,正确实现的JDBC驱动程序
//如果execute或getMoreResults返回true,则不应返回null
try(ResultSet rs=statement.getResultSet()){
//工艺流程
}
}否则{
int uc=statement.getUpdateCount();
如果(uc==-1){
//当isResultSet为false且更新计数为-1时,
//没有更多的结果
打破
}
System.out.println(“更新计数:+uc”);
}
isResultSet=statement.getMoreResults()
}