java servlet调用带有多个返回结果集的存储过程
本人开发的开发者技术变现资源聚集地,大家支持下,下面是网址
https://www.baiydu.com
一、mysql存储过程
这里我先说下我这个功能实现的逻辑及途中遇到的一些问题。这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要返回更多结果集也是一样的,如果需要判断,就继续增加存储过程参数,如果不需要判断就直接在存储过程中,增加查询的SQL语句即可)。实现这个功能还有更简单的方法,可以写SQL关联语句查询出两张表的结果,返回一个组合的结果集。我这里当然是为了实现这个效果,所以把它的实现复杂化了。继续说下我今天在mysql上遇到的一个问题,究竟是什么原因,其实我现在也没弄清楚,写这个存储过程前,我给要查询的表中增加了两个字段,然后修改了一个字段的名称,增加的字段到没有任何影响,但是修改过名称的字段就出问题了,在java中调用这个存储过程时,就提示这个字段不存在。之后我将这个修改过的字段再修改回去就好了,下面贴存储过程代码。
1、参数
in sheetOneAccount varchar(50),in sheetTwoAccount varchar(50)
2、代码
BEGIN
/*存储过程*/
declare shareNameIsOrNoExistsVerify varchar(50);
/*验证第一个参数在第一张表中是否存在*/
SELECT name into shareNameIsOrNoExistsVerify from infosheet
where sheetOneAccount=name;
if(shareNameIsOrNoExistsVerify is not null) THEN
/*这里给返回的查询结果表中增加了一个字段,以便客户端接受到之后,首先取这个字段的
值来判断,查询这个用户是否存在,如果存在才去取对应字段的值,减少了客户端的工作量*/
/*这里nameExists AS 0表示用户存在与表中,而且表示第一张表*/
select *, 0 AS nameExists from infosheet where name=sheetOneAccount;
ELSE
/*下面查询人员不存在,返回的自定义字段值就为1, 1 AS nameExists,表示查询用户不存在,
而且表示第一张表 */ /*下面表示没查询到该人员,虽然没查询到但是还是返回了一条数据,所以在取值时,需要先取nameExists 这个字段
判断查询的人员是否存在*/
select name,1 AS nameExists from infosheet limit 0,1;
end if;
/*验证第二个参数在第二张表中是否存在*/
set shareNameIsOrNoExistsVerify=null;
SELECT name into shareNameIsOrNoExistsVerify from studentsheet
where name=sheetTwoAccount;
if(shareNameIsOrNoExistsVerify is not null) THEN
/*这里给返回的查询结果表中增加了一个字段,以便客户端接受到之后,首先取这个字段的
值来判断,查询这个用户是否存在,如果存在才去取对应字段的值,减少了客户端的工作量*/
/*这里nameExists AS 2表示用户存在于表中,而且表示第二张表*/
select *, 2 AS nameExists from studentsheet where name=sheetTwoAccount;
ELSE
/*不存在返回的自定义字段值就为3, 3 AS nameExists,表示查询用户不存在,
而且表示第二张表 */ /*下面表示没查询到该人员,虽然没查询到但是还是返回了一条数据,所以在取值时,需要先取nameExists 这个字段
判断查询的人员是否存在*/
select name,3 AS nameExists from studentsheet limit 0,1;
end if;
END
一、java Servlet
1、调用存储过程方法
//调用带有多个返回结果集的存储过程
//这里虽然是查询的结果集,但是我在数据库中写的判断是,只查询出一条数据,所以也不需要在方法中使用re.next遍历
public static JSONArray callProcReturnMultipleSet(String sql, String[] parameters) {
JSONArray masterJSONArray = new JSONArray();
JSONObject shareJSONObject=new JSONObject();
try {
conn = getConnection(); cs = conn.prepareCall(sql);
for(int i=0;i<parameters.length;i++)
{
cs.setObject(i+1, parameters[i]);
}
cs.execute();
rs = cs.getResultSet();
//如果是返回的多条数据这里,需要用JSONArray来接收。
shareJSONObject= ResultToJsonTool.resultSetToJsonObject(rs);
masterJSONArray.put(shareJSONObject); //下面这个方法就是继续循环出rs中的数据集表,java这个功能做都没.NET好,.NET返回一个dataSet直接用下标取对应的数据集
//如果你还在查询中增加了更多的表没那么继续用下面这个方法循环出数据集
if (cs.getMoreResults() == true) {
rs = cs.getResultSet();
shareJSONObject= ResultToJsonTool.resultSetToJsonObject(rs);
masterJSONArray.put(shareJSONObject);
//下面如果有第三方那个表,以此类推,同样的方法,或则这里自己可以写一个递归的方法封装下少些代码
//if (cs.getMoreResults() == true) { // } } }
catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}finally{ }
return masterJSONArray;
}
2、调用
//调用返回多个结果集的存储过程
String[] getResultSetParameter=new String[]{"hang","haha"};
String executProduceStr="call getMultipleResultSetProcudure(?,?)";
JSONArray rest=(JSONArray) MySqlHepler.callProcReturnMultipleSet(executProduceStr, getResultSetParameter);
out.println(rest.toString());
3、实现截图
由于本人也是才开始学java,如有不合理之处,请及时指出。
本人创业做的一款androidApp, 下载量已经有2000多万,各种当前热门的网络手机奖励红包全部集成,另外还有热门电影和淘宝高额优惠券!很适合各类型的用户。
java servlet调用带有多个返回结果集的存储过程的更多相关文章
- Java Servlet调用数据库复习
首先要导入jar包. 剩下的基本就是模版式的代码了: public class main { // JDBC 驱动名及数据库 URL static final String JDBC_DRIVER = ...
- java axis调用带有soap头(soapheader)的.net webservice
使用axis调用.net带soapheader的webservice是如何实现的,现在贴出代码 <?xml version="1.0" encoding="utf- ...
- Oracle 返回结果集的 存储过程
create or replace PROCEDURE SPGETROLELIST ( P_APPCODE IN VARCHAR2 , P_USERROLE IN VARCHAR2 , CUR_RES ...
- 【Mybatis】MyBatis调用带有返回结果、output参数的存储过程上与ibatis的区别
用过mybatis的应该都知道它是ibatis被Google收购后重新命名的一个工程,因此也做了大量升级.本文就来介绍下两者在调用存储过程上的一点区别,ibatis有一个专门的标签<proced ...
- Java 调用存储过程 返回结果集
这里使用Oracle数据库的thin连接. 下面是存储过程SQL 1 createorreplaceprocedure proc3(stid in student.stuid%type, stname ...
- MyBatis调用存储过程,含有返回结果集、return参数和output参数
Ibatis是我们经常使用的O/R映射框架,mybats是ibatis被Google收购后重新命名的一个工程,当然也做了大量的升级.而调用存储过程也是一次额C/S架构模式下经常使用的手段,我们知道,i ...
- (转)java 层调用Jni(Ndk) 持久化c c++ 对象
对于Jni(Ndk) 很多人应该都有印象,Android的ndk接触到的机会相对会比较多,本例子以android平台为例,pc端的话就以简单的windows为例, 编码完用vs 或是 gcc进行编译成 ...
- oracle调用存储过程和函数返回结果集
在程序开发中,常用到返回结果集的存储过程,这个在mysql和sql server 里比较好处理,直接返回查询结果就可以了,但在oracle里面 要 out 出去,就多了一个步骤,对于不熟悉的兄弟们还得 ...
- 存储过程不返回记录集导致ADO程序出错
HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF( ...
随机推荐
- MyBatis学习总结(七)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- Atitit 从 RGB 到 HSL 或 HSV 的转换
Atitit 从 RGB 到 HSL 或 HSV 的转换 1.1. 从 RGB 到 HSL 或 HSV 的转换公式与原理1 1.2. public static HSV RGB2HSV(Color ...
- paip.java 架构师之路以及java高级技术
paip.java 架构师之路以及java高级技术 1. Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...
- salesforce 零基础开发入门学习(八)数据分页简单制作
本篇介绍通过使用VF自带标签和Apex实现简单的数据翻页功能. 代码上来之前首先简单介绍一下本篇用到的主要知识: 1.ApexPages命名空间 此命名空间下的类用于VF的控制. 主要的类包括但不限于 ...
- linux 学习 常用命令
以下命令是本人的CentOS6.5系统 一.linux个目录的作用 #linux个目录的作用 /bin 所有用户都可使用的命令 /sbin 超级用户(root)可以使用的命令 /boot 系统目录建 ...
- jquery的html,text,val
.html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html(),.text() ...
- 如何解决loadrunner回放日志中的乱码问题
在Loadrunner回放脚本时,会看到replay log区会展示脚本回放时的信息.有时候选中了打印服务器返回具体信息后,服务器返回的中文字符为乱码.怎么破? 原来Loadrunner的replay ...
- java 中获取2个时间段中所包含的周数(股票的周数->从周六到周五)
Calendar 类中是以周日为开始的第一天的,所以Calendar.DAY_OF_WEEK为1的时候是周日. 在股票中有日K 周K和月K的数据. 在此之中的周K是指交易日中一周的数据,周六到周五为 ...
- 12.创建一个Point类,有成员变量x,y,方法getX(),setX(),还有一个构造方 法初始化x和y。创建类主类A来测试它。
package java1; public class Point { int x; int y; Point(int x,int y) { this.x = x; this.y = y; } pub ...
- easyuidatagrid中load,reload,loadData的区别。
摘要:datagrid中有load,reload,loadData那三个方式,皆是加载数据的,但又有差别.下面让我们一起来看看: 首先,load方法,比如我已经定义一个datagrid的id为grid ...