如何执行会返回数据集的存储过程?

vericky 2004-09-27 02:31:23
我是这样做的:

CallableStatement cstat=null;

connect.setAutoCommit(true);
cstat = connect.prepareCall("{? = call my_sp_month(?, ?, ?)}");

cstat.setInt(2, 2);
cstat.setInt(3, 2004);
cstat.setInt(4, 8);

cstat.registerOutParameter(1, Types.OTHER);

cstat.execute();

r = (ResultSet) cstat.getResultSet();

执行到cstat.registerOutParameter(1, Types.OTHER);时,出现异常说指定的类型当前的driver不支持,我不知道是否指types.OTHER。把这行去掉后,当执行到cstat.execute时,出现异常说invalid parameter binding,我估计是第一个参数没有做任何设置的原因。那我就晕倒了,不知道该如何正确的返回存储过程的数据集。

有人说用exec执行,像做一般的库表查询一样,可以么?
...全文
188 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
skylovers 2004-09-27
  • 打赏
  • 举报
回复
ResultSet rs=null;
CallableStatement cstat=null;
try{
cstat = connect.prepareCall("{CALL my_sp_month(?, ?, ?)}");

cstat.setInt(1, 2);
cstat.setInt(2, 2004);
cstat.setInt(3, 8);

rs = cstat.executeQuery();
while(rs.next())
{System.out.println("XX="+rs.getString("month");)
}
}

catch(Exception e)
{}

用exec也可以

不过我遇到了个问题就是,当存储过程有返回值(如return 0)并且还有resultSet时,如何将两者都取到?

try {
procedure = "{?=CALL up_get_Sysrole_authobj (?) }";
stm = conn.prepareCall(procedure);

//设置参数
stm.setLong(1,java.sql.Types.NUMERIC)
stm.setString(2, arid);

long backVal=stm.getLong(1);
rs = stm.executeQuery();}

是不行的....望高手指教.
youthy_yy 2004-09-27
  • 打赏
  • 举报
回复
首先,你要确定你的数据集是用游标返回的

如果是Oracle数据库,可以用OracleCallableStatement的OracleType.Cursor
lliushine 2004-09-27
  • 打赏
  • 举报
回复
关注

62,616

社区成员

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

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