问题描述
我有一个在 Sybase 的 Squirrel SQL 编辑器中运行的存储过程。存储过程有3条select语句,但是执行时只返回第一个select语句的结果。
我尝试过的:使用 Java SQL API 执行存储过程。我看到了同样的行为。此外,在 Toad for Sybase 中执行相同的存储过程并看到相同的行为。
我们公司为旧版 C++ 应用程序使用了 3rd 方数据库执行工具。该库按预期返回所有 3 个结果集。由于某种原因,我们正在删除此库。
解决方法
使用 CallableStatement#execute() 执行返回多个 ResultSet 的存储过程。
它返回一个布尔值。
If true
: 如果当前结果是一个 ResultSet
If false
: 当前结果是一个 UpdateCount
什么是更新计数? 当您在 SQL 编辑器中执行存储过程时,您会在控制台中获得一些信息,例如“4 行受影响”。此消息称为 UpdateCount。
数据库在对 API 的响应中返回这些消息以及结果集。
遍历返回的结果。
boolean hasResults = stmt.execute();
while(true) {
if(hasResults) {
//Has results is true if Current result is ResultSet
//Add code here to parse your result values
} else {
if(stmt.getUpdateCount() == -1) break; // you have reached the end of all data (updatecount + resultset)
}
hasResults = stmt.getMoreResults(); // GetMoreResults return true if the next result is ResultSet else it returns false if its updatecount.
}
如果您不希望 UpdateCounts 作为数据库结果的一部分返回,您可以在存储过程中包含语句 SET NOCOUNT ON