Java Sybase存储过程返回了多个结果集
我有一个问题,我使用jdbcTemplate exec一个Sybase存储过程返回mulit ResultSet,如何获得所有ResultSetJava Sybase存储过程返回了多个结果集,java,stored-procedures,sybase,jdbctemplate,Java,Stored Procedures,Sybase,Jdbctemplate,我有一个问题,我使用jdbcTemplate exec一个Sybase存储过程返回mulit ResultSet,如何获得所有ResultSet if object_id('p_if_pms_spyh_upload') <> null drop proc p_if_pms_spyh_upload go create procedure p_if_pms_spyh_upload @status char(1) --- 订单状态
if object_id('p_if_pms_spyh_upload') <> null
drop proc p_if_pms_spyh_upload
go
create procedure p_if_pms_spyh_upload
@status char(1) --- 订单状态 A/D
as
begin
declare @rq char(8) , @errcode int, @errmsg varchar(60)
create table #head (
op_type char(2) not null, -- 操作类型 A 表示新建 D 表示删除
xyqrid varchar(30) not null, -- 确认函编号
dh varchar(20) not null, -- 优惠单编号
yhdmc varchar(30) not null, -- 优惠单名称
type varchar(18) not null, -- 直降种类 04表示10有函
qsrq char(8) not null, -- 起始日期
jzrq char(8) not null, -- 截止日期
qssj char(8) not null, -- 起始时间
jzsj char(8) not null, -- 截止时间
jsfs varchar(8) not null, ---结算方式
oano varchar(30) not null, -- OA公文号
description varchar(200) not null, -- 优惠单描述
oprrq char(8) not null, -- 审批删除日期
oprsj char(6) not null -- 审批删除时间
)
create table #detail (
op_type char(2) not null, -- 操作类型 A 表示新建 D 表示删除
xyqrid varchar(30) not null, -- 确认函编号
dh varchar(20) not null, -- 优惠单编号
gdsid varchar(20) not null, -- 优惠商品名称
orgid varchar(10) not null, -- 销售组织编码
qdid char(4) not null, -- 渠道编码
tjlb varchar(20) not null, -- 商品组
pp varchar(20) not null, -- 品牌编码
gys varchar(20) not null, -- 供应商编码
fmid varchar(10) not null, -- 库位编码
yhed numeric(16,4) not null, -- 优惠额度
yhsl numeric(16,4) not null, -- 优惠数量
unit varchar(3) not null -- 销售单位
)
-- 删除1个月之前已成功发送的数据
select @rq=convert(char(8),dateadd(month,-1,getdate()),112)
select @errcode=0
select @errmsg = ''
begin tran
delete from IV_YHD_HEAD_SPYH_TO_PMS where processflag = 'S' and convert(char(8),lastmodified,112) = @rq
if @@transtate = 2 or @@transtate = 3 or @@error != 0
begin
select @errcode=-1
select @errmsg = '删除IV_YHD_HEAD_SPYH_TO_PMS一月之前的数据失败!'
goto procfail
end
delete from IV_YHD_DETAIL_SPYH_TO_PMS where processflag = 'S' and convert(char(8),lastmodified,112) = @rq
if @@transtate = 2 or @@transtate = 3 or @@error != 0
begin
select @errcode=-1
select @errmsg = '删除IV_YHD_DETAIL_SPYH_TO_PMS一月之前的数据失败!'
goto procfail
end
insert into #head
select op_type, xyqrid, dh, yhdmc, type, qsrq,jzrq, qssj, jzsj, jsfs, oano, description, oprrq, oprsj
from IV_YHD_HEAD_SPYH_TO_PMS where processflag = 'Y' and op_type = @status
update IV_YHD_HEAD_SPYH_TO_PMS set processflag = 'R'
from IV_YHD_HEAD_SPYH_TO_PMS a, #head b
where a.dh = b.dh and a.processflag = 'Y' and a.op_type = @status
if @@transtate = 2 or @@transtate = 3 or @@error != 0
begin
select @errcode=-1
select @errmsg = '更新IV_YHD_HEAD_SPYH_TO_PMS表数据出错!'
goto procfail
end
insert into #detail
select a.op_type,a.xyqrid,a.dh,a.gdsid,a.orgid,a.qdid,a.tjlb,a.pp,a.gys,a.fmid,a.yhed,a.yhsl,a.unit
from IV_YHD_DETAIL_SPYH_TO_PMS a,#head b
where a.dh = b.dh and a.processflag = 'Y' and a.op_type = @status
update IV_YHD_DETAIL_SPYH_TO_PMS set processflag = 'R'
from IV_YHD_DETAIL_SPYH_TO_PMS a, #head b
where a.dh = b.dh and a.processflag = 'Y' and a.op_type = @status
if @@transtate = 2 or @@transtate = 3 or @@error != 0
begin
select @errcode=-1
select @errmsg = '更新IV_YHD_DETAIL_SPYH_TO_PMS表数据出错!'
goto procfail
end
procsuccess:
commit trans
goto myexit
procfail:
rollback trans
goto myexit
myexit:
select @errcode,@errmsg
select op_type, xyqrid, dh, yhdmc, type, qsrq, jzrq,qssj, jzsj, jsfs, oano, description, oprrq, oprsj from #head
select op_type,xyqrid,dh,gdsid,orgid,qdid,tjlb,pp,gys,fmid,yhed,yhsl,unit from #detail
end
go
grant all on p_if_pms_spyh_upload to ws
go
这是调试结果
updateCount:1
updateCount:1
updateCount:1
updateCount:0
updateCount:0
updateCount:1
updateCount:1
updateCount:1
updateCount:1
org.apache.commons.dbcp.DelegatingResultSet@bd4e3c
errCode:0 errMsg:
updateCount:1
updateCount:1
updateCount:1
null
这是正确的代码
ResultSet rs = null;
int updateCount = -1;
int index = 1;
do {
updateCount = cs.getUpdateCount();
if (updateCount != -1) {// it means it returns a updateCount
cs.getMoreResults();
continue;
}
rs = cs.getResultSet();
if (rs != null) {// it means it returns a ResultSet
if (1 == index) {
index++;
if(rs.next()) {
int errCode = rs.getInt(1);
String errMsg = rs.getString(2);
// System.out.println("errCode:" + errCode + " errMsg:" + errMsg);
if (!(Constants.PROC_ERRORCODE_SUCC == errCode)) {
logger.error("call sp execute error:" + errMsg);
}
}
rs.close(); // it should call close() here
} else if (2 == index) {
index++;
while (rs.next()) {
//proc the second resultSet
}
rs.close(); // it should call close() here
} else if (3 == index) {
index++;
while (rs.next()) {
//proc the second resultSet
}
rs.close(); // it should call close() here
} else {
break;
}
cs.getMoreResults();
continue;
}
} while (!(updateCount == -1 && rs == null)); //nothing to return
您一直在循环中调用getMoreResults
CallableStatement cstmt;
ResultSet rs;
int i;
...
cstmt.execute(); // Call the stored procedure
while (cstmt.getMoreResults()){ // If we have more Results
rs = cstmt.getResultSet(); // Get the result set
while (rs.next()) {
i = rs.getInt(1);
System.out.println("Value from result set = " + i);
}
}
rs.close();
cstmt.close();
对于存储的进程,似乎总是返回三个结果集
代码应该可以让您接近,但是如果您想调试它,可以像我向您展示的那样执行循环,并在循环中调用ResultSetMetaData rsmd=rs.getMetaData();rsmd对象将告诉你关于电流的几乎所有信息,这样你就可以真正了解返回的是什么。
CallableStatement cstmt;
ResultSet rs;
int i;
...
cstmt.execute(); // Call the stored procedure
// select @errcode,@errmsg
rs = cstmt.getResultSet(); // Get the result set
while (rs.next()) {
// Process the resultset
}
rs.close();
// select op_type, xyqrid, dh, yhdmc, type, qsrq, jzrq,qssj, jzsj, jsfs, oano, description, oprrq, oprsj from #head
rs = cstmt.getResultSet(); // Get the result set
while (rs.next()) {
// Process the resultset
}
rs.close();
// select op_type,xyqrid,dh,gdsid,orgid,qdid,tjlb,pp,gys,fmid,yhed,yhsl,unit from #detail
rs = cstmt.getResultSet(); // Get the result set
while (rs.next()) {
// Process the resultset
}
rs.close();
cstmt.close();
你并不真的需要循环,如果你知道你有一个固定的结果集,你可以调用getMoreResults()。首先谢谢,但是有些更新正在进行中,我不熟悉sp,所以我不知道如何处理,这让我头疼。我粘贴了sp,你能帮我吗@MikeI让你说,在网上找些东西,粘贴一些新代码up@Mike. 我调试它,发现一些东西让我困惑。我还显示了调试的结果。我想如果grant命令与此有关?有什么想法吗?嗨@Mike,你应该调用cstmt.getMoreResults()方法到下一个ResultSet,但是你提醒我调用rs.close(),非常感谢,我解决了这个困扰我两天的问题。你太好了。我还粘贴了代码。
CallableStatement cstmt;
ResultSet rs;
int i;
...
cstmt.execute(); // Call the stored procedure
// select @errcode,@errmsg
rs = cstmt.getResultSet(); // Get the result set
while (rs.next()) {
// Process the resultset
}
rs.close();
// select op_type, xyqrid, dh, yhdmc, type, qsrq, jzrq,qssj, jzsj, jsfs, oano, description, oprrq, oprsj from #head
rs = cstmt.getResultSet(); // Get the result set
while (rs.next()) {
// Process the resultset
}
rs.close();
// select op_type,xyqrid,dh,gdsid,orgid,qdid,tjlb,pp,gys,fmid,yhed,yhsl,unit from #detail
rs = cstmt.getResultSet(); // Get the result set
while (rs.next()) {
// Process the resultset
}
rs.close();
cstmt.close();