游标用法

QL游标使用方法SQL游标使用方法
1. 为何使用游标:
  
使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL
server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
   2. 如何使用游标:
   一般地,使用游标都遵循下列的常规步骤:
   (1) 声明游标。把游标与T-SQL语句的结果集联系起来。
   (2) 打开游标。
   (3) 使用游标操作数据。
   (4) 关闭游标。

2.1. 声明游标
   DECLARE CURSOR语句SQL-92标准语法格式:
   DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR
   FOR sql-statement
   Eg:
   Declare MycrsrVar Cursor
   FOR Select * FROM tbMyData
   2.2 打开游标
   OPEN MycrsrVar
   当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据:
   FETCH FIRST from E1cursor
   或 FETCH NEXT from E1cursor
  
   2.3 使用游标操作数据
   下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动
   /* 使用游标读取数据的操作如下。*/
   DECLARE E1cursor cursor /* 声明游标,默认为FORWARD_ONLY游标 */
   FOR SELECT * FROM c_example
   OPEN E1cursor /* 打开游标 */
   FETCH NEXT from E1cursor /* 读取第1行数据*/
   WHILE @@FETCH_STATUS = 0 /* 用WHILE循环控制游标活动 */
   BEGIN
   FETCH NEXT from E1cursor /* 在循环体内将读取其余行数据 */
   END
   CLOSE E1cursor /* 关闭游标 */
   DEALLOCATE E1cursor /* 删除游标 */
 
  declare @id int,@name varchar(20);
  declare cur cursor fast_forward for
     select id,name from a;
  open cur;
  fetch next from cur into @id,@name;
  while @@fetch_status=0
  begin
      --做你要做的事

fetch next from cur into @id,@name;
  end
  close cur;
  deallocate cur;

   2.4 关闭游标
   使用CLOSE语句关闭游标
   CLOSE { { [ GLOBAL ] 游标名 } | 游标变量名 }
  
  使用DEALLOCATE语句删除游标,其语法格式如下:
   DEALLOCATE { { [ GLOBAL ] 游标名 } | @游标变量名
  
   3. FETCH操作的简明语法如下:
  
   FETCH
   [ NEXT | PRIOR | FIRST | LAST]
   FROM
   { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
  
  参数说明:
   NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH
NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。
   INTO @变量名[,…]
把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。

  
--------------------------------------------------------------------------------------------------------------------------------

  每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值:
   · 0 表示成功执行FETCH语句。
   · -1 表示FETCH语句失败,例如移动行指针使其超出了结果集。
   · -2 表示被提取的行不存在。
  由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH
语句之前测试该变量的值才能作出正确的判断。

Declare @变量名1 变量类型1
Declare @变量名2 变量类型2
declare cur cursor fast_forward for
select 字段名1,字段名2 from 表名1;
open cur;
fetch next from cur into @变量名1,@变量名2;
while @@fetch_status=0
begin
update 表名2 set 字段名[email protected]变量名1 whare 字段名[email protected]变量名2
fetch next from cur into @变量名1,@变量名2;
end
close cur;
deallocate cur;
关闭提示 关闭确 认

时间: 2024-11-06 20:13:47

游标用法的相关文章

sql的游标用法举例(Cursor)

sql的游标用法举例 DECLARE @Name varchar(40), @TrueName varchar(20) Declare authors_cursor Cursor For Select Name,TrueName From Account Open authors_cursor Fetch Next From authors_cursor INTO @Name, @TrueName While @@FETCH_STATUS = 0 Begin Print @TrueName+CO

oracle游标用法

-- 声明游标:CURSOR cursor_name IS select_statement  --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 declare        --类型定义        cursor c_job        is        select empno,ename,job,sal        from emp        where job='MANAGER';        --定义一个游标变量v_

Oracle动态游标用法

最近在写一个存档的procedure时,因为条件不同,组成的SQL也不同. 1 CREATE OR REPLACE 2 PROCEDURE led_bl_issue_save_new ----大标签发料存档LED031C 3 ( 4 i_worknosid NUMBER,---工单ID 5 i_led_partno VARCHAR2,---LED料号 6 i_led_partid VARCHAR2,---LED料号ID 7 i_bincode1 VARCHAR2, ---BIN1 8 i_dat

Mongodb基础用法及查询操作[转载]

插入多条测试数据> for(i=1;i<=1000;i++){... db.blog.insert({"title":i,"content":"mongodb测试文章.","name":"刘"+i});                                                      ... } db.blog.list.find().limit(10).forEach(

Mongodb 数组查询

插入多条测试数据> for(i=1;i<=1000;i++){... db.blog.insert({"title":i,"content":"mongodb测试文章.","name":"刘"+i});                                                      ... } db.blog.list.find().limit(10).forEach(

游标基础用法

Create PROCEDURE P_InsertSubject@SubjectId intASDECLARE rs CURSOR LOCAL SCROLL FORselect studentid from student where StudentGradu = 1OPEN rsFETCH NEXT FROM rs INTO @tempStudentIDWHILE @@FETCH_STATUS = 0BEGINInsert SelSubject values (@SubjectId,@temp

mysql中游标在存储过程中的详细用法

昨天写的一个东东,分享下给大家. drop PROCEDURE  if exists sp_cleanUserData; CREATE  PROCEDURE `sp_cleanUserData`() BEGIN /*定义游标*/ declare v_dt bigint(20) default 0 ; declare v_num INT DEFAULT 0; /*游标循环到末尾时给定义的常量赋值*/ declare cur_userId   CURSOR FOR select  userId fr

Sql server存储过程中常见游标循环用法

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while

分组PARTITION BY及游标CURSOR的用法

基础数据表: select * from dbo.RecommendationChanelVersionRelation: 数据如下: 要求按照ChannelVersionID分组,对每组中的OrderId根据ID由小到大的顺序,更新为1,2,3,4,5... 方法一(分组PARTITION BY): IF OBJECT_ID('tempdb..#tempdt') IS NOT NULLDROP TABLE #tempdt;select RowNumOrderByChannelVersionID