怎么取到sqlserver的系统存储过程sp_cursorfetch返回的结果集?

bhw0871 2004-10-12 04:05:24
--存储过程
CREATE procedure Page_proc
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
GO

--直接执行存储过程的结果
exec page_proc 'select * from sysobjects',1,10

。。。

10 92 1

sysobjects 1 S 1 25 -536870909 96
sysindexes 2 S 1 29 -536870907 32
syscolumns 3 S 1 32 -536870909 80
systypes 4 S 1 20 -536870909 80
syscomments 6 S 1 10 -536870911 48
sysfiles1 8 S 1 4 -536870912 0
syspermissions 9 S 1 11 -536870911 16
sysusers 10 S 1 20 -536870909 96
sysproperties 11 S 1 5 -536870911 32
sysdepends 12 S 1 11 -536870909 64 。。。



--test.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*"%>
<html>
<head>
<title>测试</title>
<link rel="stylesheet" href="css.css" type="text/css">
<body class="bg_body" >

<%
int EveryPage=10;//每页显示的记录数;
int OnPage=1; //当前显示的页数;
int Total=0;//记录的总数;
int TotalPage=0;//记录的总页数;

try
{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=SupplyQuery";
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
String procsql="{call Page_proc(?,?,?)}";
java.sql.CallableStatement stmt=conn.prepareCall(procsql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from sysobjects";

stmt.setString(1,sql);
stmt.setInt(2,OnPage);
stmt.setInt(3,EveryPage);

out.println("执行存储过程"+stmt.execute()+"<p>");

ResultSet rs=null;
/*
while(stmt.getMoreResults())
{
rs=stmt.getResultSet();
while(rs.next())
{
out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
}
*/


rs=stmt.getResultSet();

out.println("第一个结果集输出:"+"<p>");

while(rs.next())
{
out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));

}

out.println("结束。"+"<p>");



if(stmt.getMoreResults())
{
rs=stmt.getResultSet();
out.println("第二个结果集输出:"+"<p>");


while(rs.next())
{
out.println("共"+rs.getString(1)+"页 "+"共"+rs.getString(2)+"条记录 第"+rs.getString(3)+"页"+"<p>");
}

out.println("结束。"+"<p>");

}
else
out.println("wrong");



if(stmt.getMoreResults())
{

rs=stmt.getResultSet();


out.println("第三个结果集输出:"+"<p>");
while(rs.next())
{
out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));
out.println("right");

}
out.println("结束。"+"<p>");

}
else
out.println("wrong");


rs.close();
stmt.close();
conn.close();


}
catch(SQLException e)
{
e.printStackTrace();
}
%>
</body>
</html>

页面输出结果:
执行存储过程true
第一个结果集输出:

结束。

第二个结果集输出:

共10页 共92条记录 第1页

结束。

第三个结果集输出:

结束。
...全文
1009 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bhw0871 2004-11-11
  • 打赏
  • 举报
回复
来人帮忙啊!
bhw0871 2004-10-27
  • 打赏
  • 举报
回复
就是不知道是哪里的问题,才把所有相关的都帖出来!
Andy__Huang 2004-10-27
  • 打赏
  • 举报
回复
我覺得你應該反有問題的代碼帖出來就夠了﹗
prcgolf 2004-10-27
  • 打赏
  • 举报
回复
UP
禽兽v5 2004-10-26
  • 打赏
  • 举报
回复
zhuan到sql server论坛问问。

MS-SQL Server->数据库开发
http://community.csdn.net/expert/deeptree/RoomForum.asp?roomid=5704
bhw0871 2004-10-26
  • 打赏
  • 举报
回复
没有人啊?
bhw0871 2004-10-26
  • 打赏
  • 举报
回复
已经试过,只要不是exec sp_cursorfetch @P1,16,@currentpage,@pagesize 返回的结果集,用select语句或是存储过程(非sp_cursorfetch )返回的都可以正常得到结果集!
zjcxc 2004-10-26
  • 打赏
  • 举报
回复
通过这样几个测试,初步判断一下,看看问题应该定位在jsp中,还是应该定位在存储过程中.
zjcxc 2004-10-26
  • 打赏
  • 举报
回复
看不懂jsp代码,不过,从代码分析来看,第二个记录集可以正常输出,而得到第三个记录集的方法与第二个一致,似乎不是代码的问题.

但存储过程本身是没有问题的.


楼主测试一下这样的调用:
exec page_proc 'select 总页数=3,总行数=22,当前页=1',1,10


--如果没有问题,再测试一下,把调用的表,改为查询用户表(不要查系统表,可能会是权限问题)
--如果还是有问题,则试试把存储过程修改为这样,看看第三个记录集是否可以得到结果:
CREATE procedure Page_proc
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
--exec sp_cursorfetch @P1,16,@currentpage,@pagesize
select 总页数=3,总行数=22,当前页=1
exec sp_cursorclose @P1
set nocount off
GO
bhw0871 2004-10-13
  • 打赏
  • 举报
回复
to cm4ever(小P) :
这是要注册返回参数,sqlserver下有返回参数CURSOR类型的吗?
类似oracle.jdbc.OracleTypes.CURSOR
怎么写?搜了半天没有,用Types.OTHER也不行!

不过,我这个问题主要是怎么得到存储过程的第三个返回结果集?继续求助啊!
朋友别哭 2004-10-12
  • 打赏
  • 举报
回复
up
禽兽v5 2004-10-12
  • 打赏
  • 举报
回复
一段oracle的存储过程调用语句,可供参考:

CallableStatement call = conn.prepareCall(proc_sql);
call.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

call.execute();

ResultSet rs = (ResultSet)call.getObject(1);
朋友别哭 2004-10-12
  • 打赏
  • 举报
回复
up
bhw0871 2004-10-12
  • 打赏
  • 举报
回复
来看看啊!

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧