java servlet调用带有多个返回结果集的存储过程

一、mysql存储过程

这里我先说下我这个功能实现的逻辑及途中遇到的一些问题。这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要返回更多结果集也是一样的,如果需要判断,就继续增加存储过程参数,如果不需要判断就直接在存储过程中,增加查询的SQL语句即可)。实现这个功能还有更简单的方法,可以写SQL关联语句查询出两张表的结果,返回一个组合的结果集。我这里当然是为了实现这个效果,所以把它的实现复杂化了。继续说下我今天在mysql上遇到的一个问题,究竟是什么原因,其实我现在也没弄清楚,写这个存储过程前,我给要查询的表中增加了两个字段,然后修改了一个字段的名称,增加的字段到没有任何影响,但是修改过名称的字段就出问题了,在java中调用这个存储过程时,就提示这个字段不存在。之后我将这个修改过的字段再修改回去就好了,下面贴存储过程代码。

1、参数

in sheetOneAccount varchar(50),in  sheetTwoAccount varchar(50)

2、代码

 1 BEGIN
 2 /*存储过程*/
 3 declare shareNameIsOrNoExistsVerify varchar(50);
 4    /*验证第一个参数在第一张表中是否存在*/
 5    SELECT  name into shareNameIsOrNoExistsVerify from infosheet
 6     where sheetOneAccount=name;
 7       if(shareNameIsOrNoExistsVerify is not null) THEN
 8            /*这里给返回的查询结果表中增加了一个字段,以便客户端接受到之后,首先取这个字段的
 9 值来判断,查询这个用户是否存在,如果存在才去取对应字段的值,减少了客户端的工作量*/
10                    /*这里nameExists AS 0表示用户存在与表中,而且表示第一张表*/
11         select *, 0 AS nameExists from infosheet where name=sheetOneAccount;
12       ELSE
13                /*下面查询人员不存在,返回的自定义字段值就为1, 1 AS nameExists,表示查询用户不存在,
14 而且表示第一张表 */
15
16   /*下面表示没查询到该人员,虽然没查询到但是还是返回了一条数据,所以在取值时,需要先取nameExists 这个字段
17                 判断查询的人员是否存在*/
18        select name,1 AS nameExists from infosheet limit 0,1;
19      end if;
20     /*验证第二个参数在第二张表中是否存在*/
21   set shareNameIsOrNoExistsVerify=null;
22   SELECT  name into shareNameIsOrNoExistsVerify from studentsheet
23     where name=sheetTwoAccount;
24     if(shareNameIsOrNoExistsVerify is not null) THEN
25            /*这里给返回的查询结果表中增加了一个字段,以便客户端接受到之后,首先取这个字段的
26 值来判断,查询这个用户是否存在,如果存在才去取对应字段的值,减少了客户端的工作量*/
27                    /*这里nameExists AS 2表示用户存在于表中,而且表示第二张表*/
28         select *, 2 AS nameExists from studentsheet where name=sheetTwoAccount;
29       ELSE
30        /*不存在返回的自定义字段值就为3, 3 AS nameExists,表示查询用户不存在,
31 而且表示第二张表 */
32
33     /*下面表示没查询到该人员,虽然没查询到但是还是返回了一条数据,所以在取值时,需要先取nameExists 这个字段
34                 判断查询的人员是否存在*/
35             select name,3 AS nameExists from studentsheet limit 0,1;
36      end if;
37 END

一、java Servlet

  1、调用存储过程方法

 1  //调用带有多个返回结果集的存储过程
 2      //这里虽然是查询的结果集,但是我在数据库中写的判断是,只查询出一条数据,所以也不需要在方法中使用re.next遍历
 3    public static     JSONArray callProcReturnMultipleSet(String sql, String[] parameters) {
 4       JSONArray  masterJSONArray = new JSONArray();
 5      JSONObject shareJSONObject=new JSONObject();
 6        try {
 7            conn = getConnection();

 8            cs = conn.prepareCall(sql);
 9              for(int i=0;i<parameters.length;i++)
10                 {
11                  cs.setObject(i+1, parameters[i]);
12                 }
13              cs.execute();
14             rs = cs.getResultSet();
15             //如果是返回的多条数据这里,需要用JSONArray来接收。
16             shareJSONObject= ResultToJsonTool.resultSetToJsonObject(rs);
17             masterJSONArray.put(shareJSONObject);
18
19             //下面这个方法就是继续循环出rs中的数据集表,java这个功能做都没.NET好,.NET返回一个dataSet直接用下标取对应的数据集
20             //如果你还在查询中增加了更多的表没那么继续用下面这个方法循环出数据集
21            if (cs.getMoreResults() == true) {
22                 rs = cs.getResultSet();
23                   shareJSONObject= ResultToJsonTool.resultSetToJsonObject(rs);
24                  masterJSONArray.put(shareJSONObject);
25                  //下面如果有第三方那个表,以此类推,同样的方法,或则这里自己可以写一个递归的方法封装下少些代码
26                  //if (cs.getMoreResults() == true) {
27
28                 // }
29
30             }
31
32
33         }
34         catch (Exception e) {
35             e.printStackTrace();
36             throw new RuntimeException(e.getMessage());
37         }finally{
38
39         }
40         return masterJSONArray;
41     }

2、调用

1 //调用返回多个结果集的存储过程
2            String[] getResultSetParameter=new String[]{"hang","haha"};
3            String  executProduceStr="call getMultipleResultSetProcudure(?,?)";
4            JSONArray rest=(JSONArray) MySqlHepler.callProcReturnMultipleSet(executProduceStr, getResultSetParameter);
5            out.println(rest.toString());

3、实现截图

由于本人也是才开始学java,如有不合理之处,请及时指出。

时间: 2024-08-03 09:10:12

java servlet调用带有多个返回结果集的存储过程的相关文章

Java 返回结果集的存储过程

--返回结果集的存储过程 --1.创建一个包 create package myTestPackage as type test_cursor is ref cursor; end myTestPackage; --2.创建存储过程 create procedure sp_pro9( spNo in number, p_cursor out myTestPackage.test_cursor) is begin open p_cursor for select * from student wh

Java Servlet调用数据库复习

首先要导入jar包. 剩下的基本就是模版式的代码了: public class main { // JDBC 驱动名及数据库 URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/test";//端口号,数据库名 // 数据库的用户名与密码,需要根据自己的设置 static fin

oracle pl/sql之在java中调用带有输入输出参数的oracle存储过程

只需注意一点输出参数是用CallableStatement里面的registerOutParameter方法注册进去 存储过程: import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Types; //在java中

java axis调用带有soap头(soapheader)的.net webservice

使用axis调用.net带soapheader的webservice是如何实现的,现在贴出代码 <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns

Java数组调用clone()方法,返回的对象是深拷贝还是浅拷贝?

结论: 一维数组深拷贝(重新分配内存,并复制值) 二维数组浅拷贝(只传递引用) 注:若要实现二维数组的深拷贝,可以把二维数组内的每个数组分别用clone()方法复制. 原文地址:https://www.cnblogs.com/alyiacon/p/12543122.html

【Mybatis】MyBatis调用带有返回结果、output参数的存储过程上与ibatis的区别

用过mybatis的应该都知道它是ibatis被Google收购后重新命名的一个工程,因此也做了大量升级.本文就来介绍下两者在调用存储过程上的一点区别,ibatis有一个专门的标签<procedure>,在mybatis里面已经没有这标签了,而是通过一个参数statementType="CALLABLE"来区分. 存储过程: ALTER PROCEDURE [dbo].[Pro_Create_Number] @ChannelNo VARCHAR(10) ,--渠道号 @Nu

(转)java 层调用Jni(Ndk) 持久化c c++ 对象

对于Jni(Ndk) 很多人应该都有印象,Android的ndk接触到的机会相对会比较多,本例子以android平台为例,pc端的话就以简单的windows为例, 编码完用vs 或是 gcc进行编译成dll文件,扔到系统system32 , 就是环境变量配置的文件夹底下,linux 可能也差不多是这个意思,剩下的代码就跟android一样,进行加载这个动态链接库即可. 这里就不做赘述,直接进入android平台的ndk开发,这里就主要讲下,Java层如何持久化c c++ 对象,场景可以是这样,假

存储过程不返回记录集导致ADO程序出错

HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF()       {return m_pRecordset->adoEOF == VARIANT_TRUE;}; m_pRecordset->adoEOF 将执行下面的函数(见msado15.tli) 1    inline VARIANT_BOOL Recordset15::GetadoEOF (

java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)

这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver  PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还能提高程序的执行效率, 今天在JAVA+Mysql上也实现了这个功能下面我贴出代码,这次我会讲详细点,让看的朋友能更加清楚它的好处在哪里. 一.封装的代码存储过过程调用方法   关于返回类CallableStatement的解释: CallableStatement 对象为所有的DBMS 提供了一种