SQL Cursor 游标的使用

Contents

SQL Cursor 游标的使用

这两天在做新老系统间的data migration,接触到sql的游标,记录总结一下。

我们的需求是要求map多张表,并把计算结果分别更新到一张目标表中, 新旧系统要做A/B Testing, 所以当旧表有任何更新,比如新增,删除,改动, 都要更新到新表中。

原本我选择的方案是采用批量Insert, 但碰到一个需要插入map关系的表, 其中一个field是另外一张表刚刚插入数据的id, 因此只能用循环来解决。 看了一圈SQL的for循环,实现起来略显费力。当然也有用while do或临时表等其他解决方案,欢迎发邮件探讨,这里分享一下游标的使用心得。

以我的理解,可以把游标想象成一个指针,我们使用一个指针的时候需要做的事情:

  • 声明指针
  • 把指针指向一个地址
  • 获取指针内容
  • 移动指针指向新的地址

这样理解起来游标就比较方便, 下面举个例子来说明游标的使用方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

DECLARE @vm_bucket_id bigint, @group_id bigint, @name varchar(50)

--声明游标 

DECLARE MyCursor CURSOR 

--查询出数据结果集合,游标将指向这个集合	 

FOR (SELECT id, group_id, name FROM dbo.vm_bucket WHERE id NOT IN(

SELECT object_id from dbo.resource_group_map where object=29)) ORDER BY id 

--打开游标	

OPEN MyCursor 		

--从游标中取出内容放到声明好的变量中 

FETCH NEXT FROM MyCursor INTO @vm_bucket_id, @group_id, @name

--对取出的数据进行判断和处理

WHILE @@FETCH_STATUS = 0

BEGIN

--插入数据

INSERT INTO dbo.resource_group

(name, group_id, user_id, created_date)

VALUES (@name, @group_id, 0, getutcdate())

--把刚刚插入数据的id作为结果插入到另一张表

INSERT INTO dbo.resource_group_map

(resource_group_id, object, object_id)

VALUES (@@identity, 29, @vm_bucket_id)

--读取下一行

FETCH NEXT FROM MyCursor INTO @vm_bucket_id, @group_id, @name

END

--关闭游标

CLOSE MyCursor

--释放游标

DEALLOCATE MyCursor

总结: 游标是一种较易理解易读的程序写作模型,但如果使用不当,很容易扼杀性能,谨慎使用。

原文:大专栏  SQL Cursor 游标的使用

原文地址:https://www.cnblogs.com/petewell/p/11615048.html

时间: 2024-10-07 15:46:51

SQL Cursor 游标的使用的相关文章

SQL Cursor(游标)

1.游标在数据表没有id(identity(1,1))时好用,但是游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量 2.如果能不用游标,尽量不要使用游标,用完用完之后一定要关闭和释放, 尽量不要在大量数据上定义游标,尽量不要使用游标上更新数据 Cursor:Global for--全局游标 Cursor:Local for--局部游标 LOCAL意味着游标的生存周期只在批处理或函数或存储过程中可见 GLOBAL意味着游标对于特定连接作为上下文,全局内有效 --第一步:

学习使用MS SQL Server游标(CURSOR)

说实的,使用MS SQL Server这样久,游标一直没有使用过.以前实现相似的功能,都是使用WHILE循环加临时表来实现.刚才有参考网上示例练习写了一下.了解到游标概念与语法.下面代码示例中,先是宣告你在游标中需使用变量,也就是临时存储处理字段的数据.2. 宣告一个游标,并SELECT需要处理的数据集.3. 打开游标(#8行代码).4. 从游标中拿来FETCH NEXT 数据给变量赋值.5. 循环@@FETCH_STATUS = 0条件.6. 在循环块,可以处理第一笔的记录逻辑了.本示例中是P

PL/SQL 04 游标 cursor

--游标 declare  cursor 游标名字  is  查询语句;begin  其他语句;end; --游标的属性%FOUND%NOTFOUND%ISOPEN%ROWCOUNT(当前游标的指针位移量) --FETCH的两种形式FETCH cursor_name INTO var1, var2, -;FETCH cursor_name INTO record_var; --游标的FETCH循环LOOP  FETCH cursor INTO-  EXIT WHEN cursor%NOTFOUN

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

orcale 之 PL/SQL的游标

根据我们之前了解到的情况,SQL是面向集合的,我们的查询结果一般包含多条数据,而在PL/SQL 中的变量一般只能存放一条数据,因此变量是无法满足我们的需求的.这时候我们就需要引入游标来为我们解决问题了. 我们知道在 PL/SQL 中可以使用数据控制语言(DML)对数据进行操作,而在使用这些的时候 Orcale 会在内存中为其分配一个缓存区.而游标就是指向该缓存区的指针.它可以对查询结果集的每一行数据分别进行单独的处理. 游标分为显式游标和隐式游标.显式游标是由用户声明操作的一种游标,而隐式游标是

在PL/SQL使用游标获取数据及动态SQL

1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2.  游标分类: A.  隐式游标 a.  在PL/SQL中使用DML语句时自动创建隐式游标 b.  隐式游标自动声明.打开和关闭,其名为 SQL c.  通过检查隐式游标的属性可以获得最近执行的DML 语句的信息 d.  隐式游标的属性有: %FOUND – SQL 语句影响了一行或多行时为 TRUE %NOTFOUND – SQL 语句没有影响任

SQL CURSOR

好久没有写SQL CURSOR了,语法的有点生疏了.今天写了个玩玩.呵呵!该功能是计算客户的丢失和恢复分析信息的. /* Definition: Customer had sales before, but there is no sales in the last six month. e.g: Before or in June has sales From July to Dec – no sales Customer lost in Jan */ /* Following is the

PL/SQL之--游标

一.游标简介 在PL/SQL中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),也称为缓冲区.游标是指向该区的一个指针.它提供了一种在多行结果集中对每一行数据分别进行单独处理的方法.用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. oracle中游标有如下两种: 静态游标:分为显式游标和隐式游标. ref游标:引用类型,类似于C中的指针. 二.静态游标 静态游标分为显式游标和隐式游标

SQL Server 游标

什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据. 一般复杂的存储过程,都会有游标的出现,他的用处主要有: 定位到结果集中的某一行. 对当前位置的数据进行读写. 可以对结果集中的数据单独操作,而不是整行执行相同的操作. 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁. 游标的分类 根据游标检测结果集变化的能力和消耗资源的情况不同,SQL