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

参看了前人的一些资料,自己试了试,有几处改进:
1.关于字符集:11g的jdbc驱动叫orai18n.jar,之前是nls_charset.jar/classes12.jar
2.ArrayDescriptor:java传入oracle的数组需要处理一下
3.oracle.jdbc.OracleTypes.CURSOR:java获得oracle的游标。
package TEST;
import java.sql.*;
import java.sql.PreparedS
import java.util.ArrayL
import java.util.L
import java.util.logging.L
import java.util.logging.L
import oracle.sql.ARRAY;
import oracle.sql.ArrayD
public class test_array {
&&& static Connection connMyDB =
&&& public static Connection connDB() {
&&&&&&& S
&&&&&&& ResultS
&&&&&&& PreparedS
&&&&&&& String driver = "oracle.jdbc.driver.OracleDriver";
&&&&&&& String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:wydb";
&&&&&&& try {
&&&&&&&&&&& Class.forName(driver);
&&&&&&&&&&& connMyDB = DriverManager.getConnection(strUrl, "dev", "dev");
&&&&&&& } catch (SQLException ex) {
&&&&&&&&&&& Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
&&&&&&& } catch (ClassNotFoundException ex) {
&&&&&&&&&&& Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
&&&&&&& }
&&&&&&& return connMyDB;
&&& }
&&& public static void main(String args[]) {
&&&&&&& ArrayList arrList = new ArrayList();
&&&&&&& try {
&&&&&&&&&&& CallableStatement proc = connDB().prepareCall("{ call p_web_sql_kpi(?,?,?,?,?,?,?,?,?,?) }"); //调用存储过程
&&&&&&&&&&& //不一样的地方,获得上面创建的自定义的类型,注意大小写
&&&&&&&&&&& ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("VARRAY_LIST", connMyDB);
&&&&&&&&&&& List list = new ArrayList();
&&&&&&&&&&& list.add("TRAFFIC_PD");
&&&&&&&&&&& list.add("TRAFFIC_TCH");
&&&&&&&&&&& list.add("REQ_TBF_DL_GPRS");
&&&&&&&&&&& //把list中的元素转换成自定义的类型
&&&&&&&&&&& ARRAY array = new ARRAY(descriptor, connMyDB, list.toArray());
&&&&&&&&&&& /*重要!这里输出的全是“???”试验NLS
&&&&&&&&&&& 备注:如果在入库的过程中发现字符串的值没有入进去,
&&&&&&&&&&& 请检查有没有加载该类库orai18n.jar(11g之前:nls_charset12.jar)*/
&&&&&&&&&&& String[] tem = (String[]) array.getArray();
&&&&&&&&&&& for (String str : tem) {
&&&&&&&&&&&&&&& System.out.println(str);
&&&&&&&&&&& }
&&&&&&&&&&& //设置参数, 和普通的一样
&&&&&&&&&&& proc.setString(1, "LC");
&&&&&&&&&&& proc.setString(2, "201104自行车赛");
&&&&&&&&&&& proc.setString(3, "");
&&&&&&&&&&& proc.setString(4, "");
&&&&&&&&&&& proc.setInt(5, 9);
&&&&&&&&&&& proc.setInt(6, 11);
&&&&&&&&&&& proc.setArray(7, array);
&&&&&&&&&&& proc.setInt(8, 1);
&&&&&&&&&&& proc.setInt(9, 10);
&&&&&&&&&&& proc.registerOutParameter(10, oracle.jdbc.OracleTypes.CURSOR);
&&&&&&&&&&& proc.execute();
&&&&&&&&&&& ResultSet rs = (ResultSet) proc.getObject(10);
&&&&&&&&&&& int cols = rs.getMetaData().getColumnCount();//width=how many cols
&&&&&&&&&&& while (rs.next()) {
&&&&&&&&&&&&&&& for (int i = 1; i &= i++) {
&&&&&&&&&&&&&&&&&&& System.out.print(rs.getString(i));
&&&&&&&&&&&&&&&&&&& if (i != cols) {
&&&&&&&&&&&&&&&&&&&&&&& System.out.print(" / ");//列之间的间隔符,最后1列不需要
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& System.out.println();
&&&&&&&&&&& }
&&&&&&&&&&& rs.close();
&&&&&&&&&&& proc.close();
&&&&&&& } catch (Exception ex) {
&&&&&&&&&&& ex.getMessage();
&&&&&&& } finally {
&&&&&&&&&&& try {
&&&&&&&&&&&&&&& connMyDB.close();
&&&&&&&&&&& } catch (SQLException ex) {
&&&&&&&&&&&&&&& Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
&&&&&&&&&&& }
&&&&&&& }
&&& }
}
我们的数据库字符编码一般选zhs16GBK用以支持中文,字符集不对,把nls_charset12.jar(11g以前的)添加到classpath里面去,jdbc的lib下面。
对于Oracle 11g R2+WINDOWS SERVER 2003:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Oracle Database 11g Release 2 JDBC Drivers 的解释:
ojdbc5.jar 用于 JDK 1.5 的类。它包含 JDBC 驱动程序类,但不包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
ojdbc6.jar 用于 JDK 1.6 的类。它包含 JDBC 驱动程序类,但不包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
orai18n.jar 用于 JDK 1.5 和 1.6 的 NLS 类。它包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
该文件代替旧的nls_charset.jar/classes12.jar 文件。
orai18n.jar - NLS classes for use with JDK 1.5, and 1.6. It contains classes for NLS support in Oracle Object and Collection types. This jar file replaces the old nls_charset jar/zip files.
下载网址,请用迅雷,否则需要注册的用户名和密码:
/technetwork/database/enterprise-edition/jdbc-769.html
sqlplus的command窗口下:
var v_result refcursor
declare
& v_kpi varray_
begin
& p_web_sql_kpi(v_usr&&&&&&& =& '星星星',
&&&&&&&&&&&&&&& v_ciset&&&&& =& '201104自行车赛',
&&&&&&&&&&&&&&& v_date_begin =& '',
&&&&&&&&&&&&&&& v_date_end&& =& '',
&&&&&&&&&&&&&&& v_time_begin =& '9',
&&&&&&&&&&&&&&& v_time_end&& =& '11',
&&&&&&&&&&&&&&& v_kpi&&&&&&& =& varray_list('TRAFFIC_TCH',
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 'TRAFFIC_PD',
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 'REQ_TBF_DL_GPRS'),
&&&&&&&&&&&&&&& v_startidx&& =& 1,
&&&&&&&&&&&&&&& v_endidx&&&& =& 10,
&&&&&&&&&&&&&&& v_result&&&& =& :v_result);
/
print v_result
浏览: 47850 次
来自: 湖南长沙
You rocks, dude, works for me.T ...
感谢博主,装oracle 11g的时候选字符集的时候出了这样的 ...
这个要牢记!非常影响效率!!!
CREATE OR REPLA ...
使用迭代器可以顺利删除。至于为什么就懒得管了。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'java servlet调用带有多个返回结果集的存储过程 - L-H - 博客园
随笔 - 104
一、mysql存储过程
&&&&& 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题。这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要返回更多结果集也是一样的,如果需要判断,就继续增加存储过程参数,如果不需要判断就直接在存储过程中,增加查询的SQL语句即可)。实现这个功能还有更简单的方法,可以写SQL关联语句查询出两张表的结果,返回一个组合的结果集。我这里当然是为了实现这个效果,所以把它的实现复杂化了。继续说下我今天在mysql上遇到的一个问题,究竟是什么原因,其实我现在也没弄清楚,写这个存储过程前,我给要查询的表中增加了两个字段,然后修改了一个字段的名称,增加的字段到没有任何影响,但是修改过名称的字段就出问题了,在java中调用这个存储过程时,就提示这个字段不存在。之后我将这个修改过的字段再修改回去就好了,下面贴存储过程代码。
&&& 1、参数
&&&&& in sheetOneAccount varchar(50),in& sheetTwoAccount varchar(50)
& &2、代码
2 /*存储过程*/
3 declare shareNameIsOrNoExistsVerify varchar(50);
/*验证第一个参数在第一张表中是否存在*/
name into shareNameIsOrNoExistsVerify from infosheet
where sheetOneAccount=
if(shareNameIsOrNoExistsVerify is not null) THEN
/*这里给返回的查询结果表中增加了一个字段,以便客户端接受到之后,首先取这个字段的
9 值来判断,查询这个用户是否存在,如果存在才去取对应字段的值,减少了客户端的工作量*/
/*这里nameExists AS 0表示用户存在与表中,而且表示第一张表*/
select *, 0 AS nameExists from infosheet where name=sheetOneA
/*下面查询人员不存在,返回的自定义字段值就为1, 1 AS nameExists,表示查询用户不存在,
14 而且表示第一张表 */
/*下面表示没查询到该人员,虽然没查询到但是还是返回了一条数据,所以在取值时,需要先取nameExists 这个字段
判断查询的人员是否存在*/
select name,1 AS nameExists from infosheet limit 0,1;
/*验证第二个参数在第二张表中是否存在*/
set shareNameIsOrNoExistsVerify=null;
name into shareNameIsOrNoExistsVerify from studentsheet
where name=sheetTwoA
if(shareNameIsOrNoExistsVerify is not null) THEN
/*这里给返回的查询结果表中增加了一个字段,以便客户端接受到之后,首先取这个字段的
26 值来判断,查询这个用户是否存在,如果存在才去取对应字段的值,减少了客户端的工作量*/
/*这里nameExists AS 2表示用户存在于表中,而且表示第二张表*/
select *, 2 AS nameExists from studentsheet where name=sheetTwoA
/*不存在返回的自定义字段值就为3, 3 AS nameExists,表示查询用户不存在,
31 而且表示第二张表 */
/*下面表示没查询到该人员,虽然没查询到但是还是返回了一条数据,所以在取值时,需要先取nameExists 这个字段
判断查询的人员是否存在*/
select name,3 AS nameExists from studentsheet limit 0,1;
一、java Servlet
& 1、调用存储过程方法
//调用带有多个返回结果集的存储过程
//这里虽然是查询的结果集,但是我在数据库中写的判断是,只查询出一条数据,所以也不需要在方法中使用re.next遍历
public static
JSONArray callProcReturnMultipleSet(String sql, String[] parameters) {
masterJSONArray = new JSONArray();
JSONObject shareJSONObject=new JSONObject();
conn = getConnection();
cs = conn.prepareCall(sql);
for(int i=0;i&parameters.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());
return masterJSONA
1 //调用返回多个结果集的存储过程
String[] getResultSetParameter=new String[]{"hang","haha"};
executProduceStr="call getMultipleResultSetProcudure(?,?)";
JSONArray rest=(JSONArray) MySqlHepler.callProcReturnMultipleSet(executProduceStr, getResultSetParameter);
out.println(rest.toString());
3、实现截图
&由于本人也是才开始学java,如有不合理之处,请及时指出。Java调用存储过程返回多个结果集;CREATETABLEGOODS(IDBIGIN;COMMENTONTABLEGOODSIS'商品;COMMENTONGOODS(PRICEIS'单;COMMENTONCONSTRAINTGOODS;INSERTINTOGOODS(NAME,PRI;INSERTINTOGOODS(NAME,PRI;INSERTINTOGO
Java调用存储过程返回多个结果集
GOODS ( ID BIGINT
GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE ) , \ARCHAR (26)
NOT NULL , PRICE DOUBLE
, CONSTRAINT PK_ID PRIMARY KEY ( ID) , CONSTRAINT CHK_PRICE CHECK (price>0)
ENABLE QUERY OPTIMIZATION
) IN USERSPACE1 ; COMMENT ON TABLE
GOODS IS '商品信息表'; COMMENT ON
GOODS ( PRICE IS '单价', \名称', ID IS '编号,自动增长' ) ; COMMENT ON CONSTRAINT
GOODS.CHK_PRICE IS '价格不能为负数';
INSERT INTO GOODS (NAME,PRICE) VALUES('长虹牌3919K彩电',2100),('西门子A6冰箱',3000); INSERT INTO GOODS (NAME,PRICE) VALUES('彩虹牌E7灭蚊器',62),('西门子W91洗衣机',1600),('努力牌普通作业本',2); INSERT INTO GOODS (NAME,PRICE) VALUES('ThinkPadRT9',16000); select * from
PRICE -------------------- -------------------------- ------------------------
5 努力牌普通作业本
+2.00E+000
3 彩虹牌E7灭蚊器
+6.00E+001
4 西门子W91洗衣机
+1.00E+003
1 长虹牌3919K彩电
+2.00E+003
2 西门子A6冰箱
+3.00E+003
6 ThinkPadRT9
+1.00E+004
6 条记录已选择。
--要把“命令编辑器”的语句结束标记设为“@” CREATE PROCEDURE disGoods(IN vprice double)
LANGUAGE SQL
RESULT SETS 2
--定义两个游标
DECLARE AbvE CURSOR
WITH RETURN FOR
SELECT ID,NAME,PRICE
FROM GOODS
PRICE>= VPRICE;
DECLARE Sml CURSOR
WITH RETURN FOR
SELECT ID,NAME,PRICE
FROM GOODS
PRICE< VPRICE;
-- 打开而不关闭游标,以便返回结果集给调用此存储过程的高级语言程序
OPEN AbvE;
OPEN S END@
db2 => call disGoods(2000)
--------------
-------------------- -------------------------- ------------------------
1 长虹牌3919K彩电
+2.00E+003
2 西门子A6冰箱
+3.00E+003
6 ThinkPadRT9
+1.00E+004
3 条记录已选择。
--------------
-------------------- -------------------------- ------------------------
3 彩虹牌E7灭蚊器
+6.00E+001
4 西门子W91洗衣机
+1.00E+003
5 努力牌普通作业本
+2.00E+000
3 条记录已选择。
import java.sql.*; public class
MainClass {
public static void main(String[] args)
String sqlS
Class.forName(\
System.out.println(\注册DB2数据库驱动程序成功!\
conn = DriverManager.getConnection(\
System.out.println(\连接数据库testmydb成功!\\n\
sqlStr = \硬编码
cstmt = conn.prepareCall(sqlStr);
cstmt.execute();
rs = cstmt.getResultSet();//获得当前结果集
System.out.println(\价格大于等于2000元的商品:\
System.out.println(\编号\\t名称\\t\\t\\t\\t\\t价格\
while(rs.next())
System.out.println(rs.getInt(1)+\
if(cstmt.getMoreResults()==false)
rs.close();
cstmt.close();
conn.close();
System.out.println(\没有更多的结果集了。操作结束。\\n.Bye.\
rs = cstmt.getResultSet();
System.out.println(\价格小于2000元的商品:\
System.out.println(\编号\\t名称\\t\\t\\t\\t\\t价格\
while(rs.next())
System.out.println(rs.getInt(1)+\
if(cstmt.getMoreResults()==false)
rs.close();
cstmt.close();
conn.close();
System.out.println(\没有更多的结果集了。操作结束。\\n.Bye.\
rs.close();
cstmt.close();
conn.close();
catch(ClassNotFoundException cnfe)
System.out.println(\异常:\
catch(SQLException sqle)
System.out.println(\异常:\
catch(Exception e)
System.out.println(\异常:\
System.out.println(\程序运行结束。\\n.Good Bye.\
}//end main }//end class MainClass
三亿文库包含各类专业文献、专业论文、文学作品欣赏、幼儿教育、小学教育、外语学习资料、58Java调用存储过程返回多个结果集等内容。 
 CallableStatement调用Oracle存储过程返回结果集(ResultSet)_计算机软件及应用_IT/计算机_专业资料。Java(CallableStatement)调用 Oracle 存储过程返回结果集(ResultSet) 一...  Oracle 存储过程调用 1/8 详例实现 java 调用 ORACLE 的存储过程代码 本篇...此存储过程返回单个结果集, 其中包含一列数据 (由 Person.Contact 表中前十个...  java调用存储过程返回结果集,返回字符串_计算机软件及应用_IT/计算机_专业资料。java调用存储过程返回结果集,返回字符串 package com.utour. import java.sql....  Java调用Oracle存储过程返回查询结果集_计算机软件及应用_IT/计算机_专业资料。Java调用Oracle存储过程返回查询结果集.Java 调用 Oracle 存储过程返回查询结果集 数据...  java调用存储过程示例_计算机软件及应用_IT/计算机_专业资料。java程序调用存储...返回的 Map 中的游标结果集为 list 类型,通过 List list = (List)m.get(...  mysql返回结果集及java调用_互联网_IT/计算机_专业资料。最近做项目遇到一个问题...因此就把这个功能写成存储过程放到服务器上去执行,返回要求是一个结果集,比如 sel...  Java调用SQL Server的存储过程详解_计算机软件及应用_IT/计算机_专业资料。Java ...WHERE EmployeeID = @employeeID END 存储过程可能返回更新计数和多个结果集。Micr...  调用存储过程的几个方法_计算机软件及应用_IT/计算机_专业资料。调用存储过程的...对象用来返回一个结果集,而不是一个整数值 ///
/// 数据库连接 /// ...博客分类:
存储过程:&& 返回一个结果集和两个output参数
@sql varchar(8000)= ' ',
@RecordCount
@PageCount
exec(@sql)
set @PageCount = 1
set @RecordCount = 100
public static void execute(Connection con){
CallableStatement cstmt = con.prepareCall("{call proTest(?,?,?)}");
cstmt.setString(1, "select * from temp");
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
ResultSet rs = cstmt.executeQuery();//记录集获取到后,把rs记录集循环取出后或者调用cstmt.getMoreResults()方法后,sqlserver才会处理output返回值,否则回抛出java.sql.SQLException:Output parameters have not yet been processed. Call getMoreResults()异常
while(rs.next){
system.out.println(rs.getString(1));
rs.getMoreResults()
System.out.println("PageCount : " + cstmt.getInt(2)); //不会抛出异常
System.out.println("RecordCount : " + cstmt.getInt(3));*/
catch (Exception e){
e.printStackTrace();
&二&java调用mysql存储过程返回多个结果集
import java.sql.CallableS
import java.sql.C
import java.sql.DriverM
import java.sql.ResultS
import java.sql.SQLE
public class MainClass {
public static void main(String[] args) throws SQLException {
Connection conn =
CallableStatement comm =
ResultSet ds =
String commStr = "";
String content = "";
String dbUrl = "jdbc:mysql://localhost:3306/mydb1";
String theUser = "root";
String thePw = "root";
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = (Connection) DriverManager.getConnection(dbUrl, theUser,
commStr = "call my_proc('')";
comm = ((java.sql.Connection) conn).prepareCall(commStr);
comm.execute();
ds = comm.getResultSet();
while (ds.next()) {
if (content == "") {
content += "结果集1:\nC1\tC2\tC3";
content += "\n" + ds.getString(1) + "\t" + ds.getInt(2) + "\t"
+ ds.getDate(3);
if (comm.getMoreResults() == true) {
content += "\n\n结果集2:\nC1\tC3";
ds = comm.getResultSet();
while (ds.next()) {
content += "\n" + ds.getString(1) + "\t" + ds.getDate(3);
System.out.println(content);
} catch (Exception e) {
} finally {
if (ds != null)
ds.close();
if (comm != null)
comm.close();
if (conn != null)
conn.close();
结果集1:
C1 C2 C3
zhao 10
结果集2:
C1 C3
zhenlong
mysql存储过程如下:
DROP PROCEDURE IF EXISTS mydb1.my_
CREATE PROCEDURE mydb1.`my_proc`(pDate Date)
select * from table1 where c1 = 'zhao' and C3 & pD
select * from table1 where c1 = 'zhenlong' and C3 & pD
浏览: 303787 次
来自: 潘多拉
代码好像不完整,后端没串起来的感觉
我用这种方式去,貌似没啥效果,楼主!
这个问题常遇到,老是想不起来解决方法,记住了
在不删掉integratedSecurity=的情况 ...
取CPU号和取硬盘号,在linux下可以用吗?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'java调用SqlServer分页存储过程的,返回多个结果集
Sql代码& USE [Db_8za8za_2]&&&&& GO&&&&& &&&& SET ANSI_NULLS ON&&&&& GO&&&&& SET QUOTED_IDENTIFIER ON&&&&& GO&&&&& -- =============================================&&&&& -- Description:&&& &Description,,通用分页存储过程&&&&&& -- =============================================&&&&& ALTER PROCEDURE [dbo].[paging ]&&&&& &&& -- Add the parameters for the stored procedure here&&&&& &&& --传入参数&&&&& &&& @SqlStr nvarchar(4000), --查询字符串&&&&& &&& @CurrentPage int, --第N页(当前页数)&&&&& &&& @PageSize int --每页行数&&&&& AS&&&&& BEGIN&&&&& &&& -- SET NOCOUNT ON added to prevent extra result sets from&&&&& &&& -- interfering with SELECT statements.&&&&& &&& SET NOCOUNT ON;&&&&& &&& --定义变量&&&&& &&& DECLARE @CursorId int --CursorId是游标的id&&&&& &&& DECLARE @Rowcount int --总记录(行)数&&&&& &&& DECLARE @pageCount int --总页数&&&&& &&& -- Insert statements for procedure here&&&&& &&&&&&&& &&& EXEC sp_cursoropen @CursorId output,@SqlStr,&&&&& &&&&&&& @Scrollopt=1,@Ccopt=1,@Rowcount=@Rowcount OUTPUT&&&&& &&&&&&&& &&& SET @pageCount=CEILING()--设置总页数&&&&& &&&&&&&& &&& SELECT @pageCount&&&&& &&&&&&& AS 总页数,@Rowcount AS 总行数,@CurrentPage AS 当前页 --提示页数&&&&& &&&& &&& IF(@CurrentPage&@pageCount)--如果传入的当前页码大入总页码数则把当前页数设为最后一页&&&&& &&&&&&& BEGIN&&&&& &&&&&&&&&&& SET @CurrentPage = @pageCount--设置当前页码数&&&&& &&&&&&& END&&&&& &&& IF(@CurrentPage&=0)--如果传入的当前页码大入总页码数则把当前页数设为第一页&&&&& &&&&&&& BEGIN&&&&& &&&&&&&&&&& SET @CurrentPage = 1--设置当前页码数&&&&& &&&&&&& END&&&&& &&& SET @CurrentPage=(@CurrentPage-1)*@PageSize+1 --设置当前页码数&&&&& &&&& &&& EXEC sp_cursorfetch @CursorId,16,@CurrentPage,@PageSize&&&&& &&& EXEC sp_cursorclose @CursorId&&& --关闭游标&&&&& &&&& &&& SET NOCOUNT OFF&&&&& END&&&
USE [Db_8za8za_2]&& GO&& & SET ANSI_NULLS ON&& GO&& SET QUOTED_IDENTIFIER ON&& GO&& -- =============================================&& -- Description:&&& &Description,,通用分页存储过程&&& -- =============================================&& ALTER PROCEDURE [dbo].[paging ]&& &&& -- Add the parameters for the stored procedure here&& &&& --传入参数&& &&& @SqlStr nvarchar(4000), --查询字符串&& &&& @CurrentPage int, --第N页(当前页数)&& &&& @PageSize int --每页行数&& AS&& BEGIN&& &&& -- SET NOCOUNT ON added to prevent extra result sets from&& &&& -- interfering with SELECT statements.&& &&& SET NOCOUNT ON;&& &&& --定义变量&& &&& DECLARE @CursorId int --CursorId是游标的id&& &&& DECLARE @Rowcount int --总记录(行)数&& &&& DECLARE @pageCount int --总页数&& &&& -- Insert statements for procedure here&& &&&&& &&& EXEC sp_cursoropen @CursorId output,@SqlStr,&& &&&&&&& @Scrollopt=1,@Ccopt=1,@Rowcount=@Rowcount OUTPUT&& &&&&& &&& SET @pageCount=CEILING()--设置总页数&& &&&&& &&& SELECT @pageCount&& &&&&&&& AS 总页数,@Rowcount AS 总行数,@CurrentPage AS 当前页 --提示页数&& & &&& IF(@CurrentPage&@pageCount)--如果传入的当前页码大入总页码数则把当前页数设为最后一页&& &&&&&&& BEGIN&& &&&&&&&&&&& SET @CurrentPage = @pageCount--设置当前页码数&& &&&&&&& END&& &&& IF(@CurrentPage&=0)--如果传入的当前页码大入总页码数则把当前页数设为第一页&& &&&&&&& BEGIN&& &&&&&&&&&&& SET @CurrentPage = 1--设置当前页码数&& &&&&&&& END&& &&& SET @CurrentPage=(@CurrentPage-1)*@PageSize+1 --设置当前页码数&& & &&& EXEC sp_cursorfetch @CursorId,16,@CurrentPage,@PageSize&& &&& EXEC sp_cursorclose @CursorId&&& --关闭游标&& & &&& SET NOCOUNT OFF&& END&&
调用储存过程:
Java代码& &&&& &&&& import java.sql.*;&&&& &&&& public class Study3 {&&&& &&& private C&&&& &&& public ResultS&&&& &&& private CallableS&&&& &&& private String use = "sa";&&&& &&& private String pwd = "sa";&&&& &&&& &&& public Study3() {&&&& &&&&&&& try {&&&& &&&&&&&&&&& // 连

我要回帖

更多关于 java如何调用存储过程 的文章

 

随机推荐