Stored procedures 在JDBC中,当执行多个语句时,如何知道每个ResultSet属于哪个语句?

Stored procedures 在JDBC中,当执行多个语句时,如何知道每个ResultSet属于哪个语句?,stored-procedures,jdbc,Stored Procedures,Jdbc,让我们假设JDBC中的以下虚拟示例: Statement statement = connection.createStatement(); statement.execute("select * from X; call sp1(); select * from Y; call sp2(); select * Z"); int uc = statement .getUpdateCount(); boolean isResult = (uc =

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

   Statement statement = connection.createStatement();
   statement.execute("select * from X; call sp1(); select * from Y; call sp2(); select * Z");
   
   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)。注意,有5条语句在数据库端逐个执行。驱动程序发出未知数量的结果集。这是因为存储过程可能返回任意数量的结果集,这取决于它们的内部结构

对于每个检索到的结果集,有没有办法确定它属于哪个特定语句


注意,我发布了另一篇文章,重点是确定有关存储过程的信息,这些信息可能会回答主题中的问题。尽管如此,我还是希望JDBC本身能够解决这个问题。

JDBC中没有任何东西可以确定存储过程中哪个语句生成了结果集。就JDBC而言,只有一条语句,即您为执行存储过程而执行的语句。存储过程中发生的事情对于JDBC来说是一个黑匣子

对于您发布的特定示例,更合适的方法是单独执行这些语句。JDBC的期望是一次执行一条语句。SQL Server允许您执行由分号分隔的多个语句,这一点从正式的JDBC角度来看是可疑的,但SQL Server/T-SQL将其作为一种“匿名过程”处理(好像这是一个存储过程,而您执行的是单个存储过程)

从理论上讲,一个特定的驱动程序可以在JDBC规范中定义的功能之外具有这方面的功能,但是考虑到数据库及其协议通常是如何工作的,如果实际情况确实如此,我会感到惊讶

协议通常很简单,没有任何修饰,因为我想必须确切地知道存储过程中的哪个语句生成了哪个结果集1,并因此按照“result:update count=1”、“result:result set”(后跟行)等方式进行通信是很少见的

如果您确实需要知道存储过程的哪个语句生成了哪个结果集,那么您需要重新考虑您正在做的事情,不要使用生成多个结果的存储过程,而是从Java应用程序中驱动它(单独执行),或者只编写具有确定性结果的存储过程(例如,始终以完全相同的顺序生成n个结果),或在结果中添加额外的列以明确提供标识


1:或者至少,我真的想不出在什么实际情况下这些信息是相关的(调试除外)。此外,这将把调用代码与存储过程的精确和文字实现紧密地结合起来(考虑如果语句文本发生变化会发生什么情况)