对于一个存诸过程,如果返回的结果是我们预先知道的,那么可以根据存储过程定义的顺序来进行
处理(事实上一般不会这样),但对于复杂的多结果集的处理,如何定义一个通用的流程?
我们先看一下JDBC本身能为我们提供什么?
一个存储过程执行后返回的是boolean型:
boolean flag = callableStatement.execute();
如果flag为true,那么说明返回了一个结果集(ResultSet)类型,你可以用getResultSet()得到当前行所在
的结果,而如果返回为flase,说明什么呢?
如果你不进行处理,什么也不能说明,只能说明当前指针不是ResultSet,有可能是更新计数(updateCount)
也可能什么也没有反因.
那么如果当前指针为flase时如何处理?我们应该先getUpdateCount();如果返回-1,既不是结果集,又
不是更新计数了.说明没的返回了.而如果getUpdateCount()返回0或大于0,则说明当前指针是更新计数(
0的时候有可能是DDL指令).无论是返回结果集或是更新计数,那么则可能还继续有其它返回.只有在当前
指指针getResultSet()==null && getUpdateCount() == -1才说明没有再多的返回.
存储过程的返回和ResultSet类似,每次处理的返回结果相当于是ResultSet的Row,只不过存储过程的Row
最先在第一行而不是象ResultSet要先next才到第一行,存储过程向下移动一行用getMoreResults(),相
当于ResultSet的next().同样它返回boolean和上面的flag一样,只是说明当前行是不是ResultSet,如果是
flase,你还是要判断是不是updateCount,在每一行,都要先同时判断是否为ResultSet还是UpdateCount,如
果是其中一种则要继续getMoreResults(),当不是ResultSet也不是updateCount时,说明没有返回结果了,
这时再获取输出参数.
看明白了吗?
那我们就根据上面的规则来写一个通用的流程吧:
首先,我们要确定什么时候没说结果集了:
if(cs.getResultSet() == null && cs.getUpdateCount() == -1)
现在我们做一个循环:
ResultSet rs = null;
int updateCount = -1;
flag = cs.execute();
do{
updateCount = cs.getUpdateCount();
if(updateCount != -1){//说明当前行是一个更新计数
//处理.
cs.getMoreResults();
continue;//已经是更新计数了,处理完成后应该移动到下一行
//不再判断是否是ResultSet
}
rs = cs.getResultSet();
if(rs != null){//如果到了这里,说明updateCount == -1
//处理rs
cs.getMoreResults();
continue;
//是结果集,处理完成后应该移动到下一行
}
//如果到了这里,说明updateCount == -1 && rs == null,什么也没的了
}while(!(updateCount == -1 && rs == null));
cs.getXXX(int);//获取输出参数
分享到:
相关推荐
当需要从存储过程中返回多个结果时,通常会使用结果集。本篇将深入探讨如何在Oracle存储过程中创建并返回一个结果集,并结合Java代码展示如何在应用程序中使用这个结果集。 首先,我们需要理解`OUT`参数的概念。在...
在Delphi中调用SQL存储过程并获取结果是数据库编程中的一个重要环节。下面将通过给定的代码示例,详细解析Delphi如何调用SQL存储过程,并获取执行结果。 ### Delphi调用SQL存储过程的基本步骤 #### 1. 准备工作 ...
在Oracle数据库中,返回多个结果集是一个常见的需求,特别是在处理复杂的查询或存储过程时。一个结果集通常对应于SQL查询的执行结果,但有时我们可能需要在一个操作中获取并处理多个独立的结果集。这就涉及到了...
MySQL存储过程是数据库中用于执行复杂操作的一组预编译的SQL语句,它们可以接收输入参数、输出结果以及在内部处理数据。在本示例中,我们将探讨如何通过存储过程返回多个值,并且结合PHP进行调用。 首先,我们要...
Oracle存储过程可以返回多个结果集,因此我们需要使用`CallableStatement`而不是`PreparedStatement`。调用存储过程的语法是`{call procedure_name(参数列表)}`。例如: ```java CallableStatement cs = connection....
在 LINQ to SQL 中,使用存储过程可以返回结果集,包括单个结果集和多个结果集。下面我们将详细介绍如何使用 LINQ to SQL 实现存储过程的返回结果集。 一、返回单个结果集 在 LINQ to SQL 中,我们可以使用存储...
### C#多条件查询存储过程实例 #### 一、引言 在开发应用程序时,数据库查询操作是非常常见的需求之一。为了提高查询效率和代码的可维护性,使用存储过程来进行多条件查询是一种非常有效的方法。本文将通过一个具体...
- **结果集存储**:生成的INSERT语句最终会被插入到临时表`#result`中,以便后续使用或导出。 #### 4. 应用场景 - **数据库迁移**:当需要将某个数据库的数据迁移到另一个数据库时,可以通过此存储过程快速生成...
在存储过程中,可以使用游标来处理查询结果集,并通过循环来遍历这些结果。 9. **示例应用** - **用户管理**:创建一个存储过程用于添加新用户,验证用户名的唯一性。 - **数据分析**:创建一个存储过程,计算...
- **调用返回多个结果集的存储过程**:如果存储过程返回多个结果集,BIRT会自动处理并分别显示每个结果集。 6. **参考文档和资源** 为了更深入地了解BIRT调用存储过程,可以查阅官方文档和其他在线资源,例如提供...
在本篇讨论中,我们将深入探讨如何使用ADO调用存储过程以及如何将返回的结果集显示到ListView控件中,特别在VC6.0环境下进行测试。 首先,存储过程是预编译的SQL语句集合,它可以包含一系列复杂的业务逻辑,提高了...
存储过程是预编译的SQL语句集合,可以接受参数、返回结果并执行一系列操作。函数则类似于存储过程,但必须返回一个值。在Oracle中,它们都存储在数据库中,可被多次调用,提高了代码复用性和执行效率。 在Hibernate...
存储过程是一种特殊的数据库对象,能够接受输入参数、执行复杂的业务逻辑、返回结果集等。 存储过程的基本概念: * Routine: Routine 是指存储在服务器端、按应用程序逻辑编写的可以被 client 或者其他 routine ...
在这个项目中,我们结合了Spring框架、Ibatis持久层框架以及Blazeds技术,来演示如何调用存储过程并处理返回的结果集。下面将详细讲解这些技术的运用。 首先,J2EE是一种广泛用于开发分布式企业应用的平台,它提供...
例如,可以创建一个存储过程,接收参数并返回按特定字段排序的结果集。这样,不仅减少了数据传输,还能利用数据库的索引优化。 5. **参数化查询与存储过程**:存储过程支持参数化,能有效防止SQL注入攻击。在.NET中...
标题:“oracle存储过程使用游标对多表操作例子”直接指出了文章的主题是关于在Oracle环境下,如何利用存储过程和游标实现跨多个表的数据处理。描述部分重复了标题内容,强调了示例性质,表明文章将通过具体实例来...
SAP HANA中的存储过程通常是用SQLScript编写的,这是一个专门用于SAP HANA的SQL扩展集,它允许开发人员执行复杂的数据处理操作。在SAP HANA中调试存储过程时,需要注意存储过程中的代码是顺序执行的,而不是并行执行...
存储过程是一种在数据库中存储并编译好的SQL程序,它能够接受输入参数,执行一系列操作,并返回一个或多个结果集。存储过程可以提高应用程序性能、减少网络流量、简化复杂逻辑处理,并增强数据安全性。 ### 二、...
- 游标允许存储过程逐行处理结果集,提供更灵活的数据操作能力。 - 例如,遍历表中的每一行,根据当前行的值做出决策。 8. **异常处理**: - 使用`TRY...CATCH`结构,可以在存储过程中捕获和处理错误,提高程序...
存储过程可以接受输入参数,并返回结果集或输出参数值。它通常用于实现复杂的业务逻辑,比如数据处理、事务管理等。 #### 二、SQL多条件存储过程示例分析 根据给定的内容,我们将详细解析这个具体的SQL存储过程案例...