Stored procedures 在JDBC中,当执行多个语句时,如何知道每个ResultSet属于哪个语句?
让我们假设JDBC中的以下虚拟示例: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 =
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:或者至少,我真的想不出在什么实际情况下这些信息是相关的(调试除外)。此外,这将把调用代码与存储过程的精确和文字实现紧密地结合起来(考虑如果语句文本发生变化会发生什么情况)