游标(cursor)是能从包含多条记录的结果集中每次提取一行记录的机制,类似于指针,尽管游标能遍历结果中的所有行,但一次只指向一行。
游标的常见用途是保存查询结果,游标的结果集是有select语句产生,如果处理过程中需要重复用到同一个结果集,使用游标比重复查询数据库快得多。
游标的使用
声明一个游标
declare +游标名+ cursor for +select查询语句
打开游标
open +游标名
循环游标
DECLARE @UserExamID int ,@UserID int ,@ExamManageID int FETCH NEXT FROM MyCursor INTO @UserExamID, @UserID,@ExamManageID WHILE @@FETCH_STATUS =0 BEGIN --获取考试考试分数 DECLARE @UserExamScore int select @UserExamScore=sum(Score) from Score_UserAnswer where FK_UserID=@UserID AND FK_UserExamID=@UserExamID --修改考生交卷信息 UPDATE [Score_UserExam] SET [Score] =@UserExamScore,[IsComplete] = 1,[EndTime] = getdate(),[DurationSecs] = datediff(ss,BeginTime,getdate()) where PK_UserExamID=@UserExamID FETCH NEXT FROM MyCursor INTO @UserExamID, @UserID,@ExamManageID END
关闭游标
close 游标名
释放资源
deallocate 游标名
java调用游标
CallableStatement cas=conn.prepareCall("{call emppackage.selectEmps(?)}");
int index=1;
cas.registerOutParameter(index++,oracle.jdbc.OracleTypes.CURSOR);
boolean flag=cas.execute();
System.out.println(flag);
//OracleCallableStatement 可使强制造型为oracle中的存储过程的对象
//调用里面的getCursor方法获取返回的ResultSet的结果集
ResultSet rs=((OracleCallableStatement)cas).getCursor(1);
//遍历输出
while(rs.next()){
System.out.println(rs.getInt(1));
}
CallableStatement cas =conn.prepareCall("{?=call mypackage.queryEmps}");
int index=1;
cas.registerOutParameter(index++, oracle.jdbc.OracleTypes.CURSOR);
boolean flag=cas.execute();
System.out.println(flag);
ResultSet rs=((OracleCallableStatement)cas).getCursor(1);
while(rs.next()){
System.out.println(rs.getInt(1));
}