SQL游标原理和使用方法
- 格式:doc
- 大小:113.50 KB
- 文档页数:25
SQL Server游标是一种用于在数据库中进行遍历和处理数据的方法。
在SQL Server中,通常使用游标来逐行处理结果集或进行复杂的数据操作。
游标通常被认为是一种低效的方法,但在某些情况下,它也是必需的。
在SQL Server中,可以使用游标来遍历结果集。
游标一般包括打开游标、获取数据、处理数据和关闭游标等步骤。
在处理大量数据或需要逐行操作结果集时,可以使用游标来实现。
对于SQL Server中游标的循环方法,可以使用以下步骤来实现:1. 声明游标:在开始使用游标之前,首先需要声明游标变量,并将查询结果集赋值给游标变量。
2. 打开游标:声明游标后,需要打开游标以便开始处理数据。
3. 获取数据:使用FETCH语句从游标中获取一行数据,并将其赋值给变量。
在获取数据之前,通常会使用WHILE循环来检查游标是否还有数据可获取。
4. 处理数据:获取数据后,可以对数据进行相应的处理操作。
可以在这一步中实现需要的逻辑处理或数据操作。
5. 关闭游标:在完成数据处理后,需要关闭游标以释放资源并结束游标的使用。
使用游标进行循环操作在某些情况下是必需的,例如需要逐行对结果集进行操作或需要在游标中使用复杂的逻辑判断。
然而,由于游标会逐行处理数据,因此在处理大量数据时可能会导致性能问题。
在使用游标时需要谨慎考虑,并尽量避免在大型数据集上使用游标来提高性能。
从个人观点来看,游标在特定的场景下是一种有效的数据操作方法,但需要在使用时谨慎考虑性能和效率的问题。
在大多数情况下,可以通过优化查询语句或使用其他方法来代替游标来实现相同的功能。
在编写SQL Server代码时,需要根据实际情况选择合适的数据操作方法,以确保能够达到更好的性能和效率。
SQL Server游标是一种用于在数据库中进行数据操作的方法,但需要在使用时注意性能和效率的问题。
对于需要逐行处理数据或进行复杂逻辑判断的情况,可以使用游标来实现相应的功能。
然而,在大多数情况下,可以通过优化查询语句或使用其他方法来代替游标来提高性能。
SQL游标使用方法SQL游标是一种用于处理查询结果集的数据库对象。
游标可以被认为是一个指向查询结果集中的其中一行的指针,通过游标可以逐个获取结果集中的数据记录,对结果集进行遍历、更新、删除等操作。
下面将详细介绍SQL游标的使用方法。
1.使用DECLARE语句声明游标并指定游标的名称、游标的查询语句以及返回结果集的数据类型。
例如:DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name WHERE condition;2.使用OPEN语句打开游标,使得游标可以进行后续操作。
例如:OPEN cursor_name;1.使用FETCH语句获取游标的当前行数据,并且将游标指针移动到下一行。
FETCH cursor_name INTO variable1, variable2, ...;2.使用WHILE循环结构对游标进行迭代,直到游标无法再获取到下一行数据为止。
BEGIN--执行操作,处理游标当前行数据...--获取下一行数据FETCH cursor_name INTO variable1, variable2, ...;END;3.使用CLOSE语句关闭游标,释放游标使用的资源。
CLOSE cursor_name;4.使用DEALLOCATE语句释放游标的内存空间。
DEALLOCATE cursor_name;除了以上基本的游标使用方法之外,SQL游标还可以进行以下高级操作:1.可以使用SCROLL关键字创建可滚动的游标,允许在结果集中前后移动游标指针,而不仅仅是一行一行往前遍历。
DECLARE cursor_name CURSOR SCROLL FOR SELECT column1, column2 FROM table_name WHERE condition;2.可以使用FORUPDATE子句在游标中指定要更新的列,并且允许使用UPDATECURRENT语句对当前游标指向的数据进行更新操作。
Sql存储过程游标循环的⽤法及sql如何使⽤cursor写⼀个简单的循环⽤游标,和WHILE可以遍历您的查询中的每⼀条记录并将要求的字段传给变量进⾏相应的处理==================DECLARE@A1 VARCHAR(10),@A2 VARCHAR(10),@A3 INTDECLARE CURSOR YOUCURNAME FOR SELECT A1,A2,A3 FROM YOUTABLENAMEOPEN YOUCURNAMEfetch next from youcurname into @a1,@a2,@a3while @@fetch_status<>-1beginupdate … set …-a3 where ………您要执⾏的操作写在这⾥fetch next from youcurname into @a1,@a2,@a3endclose youcurnamedeallocate youcurname—————————————在应⽤程序开发的时候,我们经常可能会遇到下⾯的应⽤,我们会通过查询数据表的记录集,循环每⼀条记录,通过每⼀条的记录集对另⼀张表进⾏数据进⾏操作,如插⼊与更新,我们现在假设有⼀个这样的业务:⽼师为所在班级的学⽣选课,选的课程如有哲学、马克思主义政治经济学、⽑泽东思想概论、邓⼩平理论这些课,现在操作主要如下:1) 先要查询这些还没有毕业的这些学⽣的名单,毕业过后的⽆法进⾏选课;2) 在批量的选取学⽣的同时,还需要添加对应的某⼀门课程;3) 点添加后选课结束。
数据量少可能看不出⽤Java程序直接多次进⾏数据库操作这种办法实现的弱点,因为它每次在操作数据库的时候,都存在着频繁的和数据库的I/O直接交互,这点性能的牺牲实属不应该,那我们就看下⾯的⽅法,通过存储过程的游标⽅法来实现:建⽴存储过程: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,@tempStudentID)FETCH NEXT FROM rs INTO @tempStudentIDENDCLOSE rsGO使⽤游标对记录集循环进⾏处理的时候⼀般操作如以下⼏个步骤:1、把记录集传给游标;2、打开游标3、开始循环4、从游标中取值5、检查那⼀⾏被返回6、处理7、关闭循环8、关闭游标上⾯这种⽅法在性能上⾯⽆疑已经是提⾼很多了,但我们也想到,在存储过程编写的时候,有时候我们尽量少的避免使⽤游标来进⾏操作,所以我们还可以对上⾯的存储过程进⾏改造,使⽤下⾯的⽅法来实现:Create PROCEDURE P_InsertSubject@SubjectId intASdeclare @i int,@studentidDECLARE @tCanStudent TABLE(studentid int,FlagID TINYINT)BEGINinsert @tCanStudent select studentid,0 from student where StudentGradu = 1SET @i=1WHILE( @i>=1)BEGINSELECT @studentid=''SELECT TOP 1 @studentid = studentid FROM @tCanStudent WHERE flagID=0SET @i=@@ROWCOUNTIF @i<=0 GOTO Return_LabInsert SelSubject values (@SubjectId,@studentid)IF @@error=0UPDATE @tCanStudent SET flagID=1 WHERE studentid = @studentidReturn_Lab:ENDEndGO我们现在再来分析以上这个存储过程,它实现的⽅法是先把满⾜条件的记录集数据存放到⼀个表变量中,并且在这个表变量中增加⼀个FLAGID进⾏数据初始值为0的存放,然后去循环这个记录集,每循环⼀次,就把对应的FLAGID的值改成1,然后再根据循环来查找满⾜条件等于0的情况,可以看到,每循环⼀次,处理的记录集就会少⼀次,然后循环的往选好课程表⾥⾯插⼊,直到记录集的条数为0时停⽌循环,此时完成操作。
SQL游标代码⽰例原理:游标就是把数据按照指定要求提取出相应的数据集,然后逐条进⾏数据处理。
1.1游标的概念游标(Cursor)它使⽤户可逐⾏访问由SQL Server返回的结果集。
使⽤游标(cursor)的⼀个主要的原因就是把集合操作转换成单个记录处理⽅式。
⽤SQL语⾔从数据库中检索数据后,结果放在内存的⼀块区域中,且结果往往是⼀个含有多个记录的集合。
游标机制允许⽤户在SQL server内逐⾏地访问这些记录,按照⽤户⾃⼰的意愿来显⽰和处理这些记录。
1.2 游标的优点从游标定义可以得到游标的如下优点,这些优点使游标在实际应⽤中发挥了重要作⽤:1)允许程序对由查询语句select返回的⾏集合中的每⼀⾏执⾏相同或不同的操作,⽽不是对整个⾏集合执⾏同⼀个操作。
2)提供对基于游标位置的表中的⾏进⾏删除和更新的能⼒。
3)游标实际上作为⾯向集合的数据库管理系统(RDBMS)和⾯向⾏的程序设计之间的桥梁,使这两种处理⽅式通过游标沟通起来。
1.3 游标的使⽤讲了这个多游标的优点,现在我们就亲⾃来揭开游标的神秘的⾯纱。
使⽤游标的顺序:声名游标、打开游标、读取数据、关闭游标、删除游标。
1.3.1声明游标最简单游标声明:DECLARE <游标名>CURSOR FOR<SELECT语句>;其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询1.3.2 打开游标⾮常简单,我们就打开刚才我们声明的游标mycursorOPEN mycursor1.3.3读取数据FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]参数说明:NEXT 取下⼀⾏的数据,并把下⼀⾏作为当前⾏(递增)。
由于打开游标后,⾏指针是指向该游标第1⾏之前,所以第⼀次执⾏FETCH NEXT操作将取得游标集中的第1⾏数据。
sql中cursor的用法SQL中的Cursor用法在SQL中,Cursor(游标)是一种用于处理查询结果集的机制,它允许我们逐行处理查询结果,类似于在程序中使用迭代器来遍历集合。
本文将介绍Cursor的用法,包括Cursor的声明、打开、关闭以及使用过程中的注意事项。
1. Cursor的声明在SQL中,我们首先需要声明一个Cursor来定义要处理的查询结果集。
Cursor的声明通常包括以下几个步骤:(1)使用DECLARE关键字声明Cursor的名称和数据类型。
例如:DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name;(2)使用OPEN关键字打开Cursor,使其准备好返回数据。
例如:OPEN cursor_name;(3)使用FETCH NEXT关键字获取第一行数据,并将光标移动到下一行。
例如:FETCH NEXT FROM cursor_name INTO @variable1, @variable2;(4)使用CLOSE关键字关闭Cursor,释放相关资源。
例如:CLOSE cursor_name;(5)使用DEALLOCATE关键字释放Cursor的内存空间。
例如:DEALLOCATE cursor_name;2. Cursor的使用Cursor的使用通常包括以下几个步骤:(1)声明一个Cursor并打开它。
(2)使用FETCH NEXT语句获取第一行数据,并将光标移动到下一行。
(3)使用WHILE循环来遍历查询结果集,直到所有行都被处理完毕。
(4)在循环中,可以根据需要对每一行数据进行处理,例如进行计算、更新或删除操作等。
(5)在循环结束后,关闭Cursor并释放相关资源。
3. Cursor的注意事项在使用Cursor时,需要注意以下几点:(1)Cursor的声明和使用应该放在BEGIN和END之间,以确保它们在同一个作用域内。
SQL游标(cursor)详细说明及内部循环使⽤⽰例游标 游标(cursor)是系统为⽤户开设的⼀个数据缓冲区,存放SQL语句的执⾏结果。
每个游标区都有⼀个名字,⽤户可以⽤SQL语句逐⼀从游标中获取记录,并赋给主变量,交由主语⾔进⼀步处理。
游标是处理结果集的⼀种机制吧,它可以定位到结果集中的某⼀⾏,多数据进⾏读写,也可以移动游标定位到你所需要的⾏中进⾏操作数据。
⼀般复杂的存储过程,都会有游标的出现,他的⽤处主要有:1. 定位到结果集中的某⼀⾏。
2. 对当前位置的数据进⾏读写。
3. 可以对结果集中的数据单独操作,⽽不是整⾏执⾏相同的操作。
4. 是⾯向集合的数据库管理系统和⾯向⾏的程序设计之间的桥梁。
优点 在数据库中,游标是⼀个⼗分重要的概念。
游标提供了⼀种对从表中检索出的数据进⾏操作的灵活⼿段,就本质⽽⾔,游标实际上是⼀种能从包括多条数据记录的结果集中每次提取⼀条记录的机制。
游标总是与⼀条SQL 查询语句相关联因为游标由结果集(可以是零条、⼀条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。
当决定对结果集进⾏处理时,必须声明⼀个指向该结果集的游标。
如果曾经⽤C 语⾔写过对⽂件进⾏处理的程序,那么游标就像您打开⽂件所得到的⽂件句柄⼀样,只要⽂件打开成功,该⽂件句柄就可代表该⽂件。
对于游标⽽⾔,其道理是相同的。
可见游标能够实现按与传统程序读取平⾯⽂件类似的⽅式处理来⾃基础表的结果集,从⽽把表中数据以平⾯⽂件的形式呈现给程序。
我们知道关系数据库管理系统实质是⾯向集合的,在MS SQL SERVER 中并没有⼀种描述表中单⼀记录的表达形式,除⾮使⽤where ⼦句来限制只有⼀条记录被选中。
因此我们必须借助于游标来进⾏⾯向单条记录的数据处理。
由此可见,游标允许应⽤程序对查询语句select 返回的⾏结果集中每⼀⾏进⾏相同或不同的操作,⽽不是⼀次对整个结果集进⾏同⼀种操作;它还提供对基于游标位置⽽对表中数据进⾏删除或更新的能⼒;⽽且,正是游标把作为⾯向集合的数据库管理系统和⾯向⾏的程序设计两者联系起来,使两个数据处理⽅式能够进⾏沟通。
sql server游标的使用方法
SQL server游标是一个强大的数据处理工具,可以实现循环处理。
它能够依据指定的条件检查结果表中的每一行,并对所命中的行采取
相应的处理操作,可用于查询结果处理,更新,删除等操作。
A游标分为只读、可更新、只覆盖3种类型。
只读游标:只读游标允许从结果中读取数据,不允许更新或插入
新的数据。
只读游标经常用作报表,处理大量的查询数据。
可更新游标:可更新游标允许对结果集进行更改,可以插入新的行,更改现有的行或者删除行。
只覆盖游标:只覆盖游标与可更新游标相似,但只覆盖游标限制
了只能更新或删除已有的行,而不允许插入新的行。
使用SQL server游标需要以下步骤:
第一步:声明游标。
声明游标用于定义游标的类型,游标的名称,设置可检索的行数以及需要检索的列。
第二步:打开游标。
在打开游标之后,即可以开始查询游标中可
检索到的行。
第三步:从游标中获取数据。
使用FETCH关键字从游标中读取数据。
第四步:关闭并释放游标。
使用CLOSE关键字关闭游标,并使用DEALLOCATE 关键字释放游标占用的资源。
SQL Server游标可以很好地满足在复杂表结构环境下的数据处理的需求,但如果使用不善,也可能带来性能问题。
因此,在使用SQL Server游标时,需要谨慎处理,而不是任意使用,以免造成性能问题。
SQL Server游标的使用例子1.概述SQL Server是一种常用的关系型数据库管理系统,它提供了多种数据访问和处理的工具和功能。
其中,游标是一种用来在SQL Server中逐行处理数据的重要工具。
本文将介绍SQL Server游标的使用方法和例子。
2.游标的基本概念游标是一种用来在SQL Server中逐行处理数据的机制。
它允许用户逐行访问数据集,对每一行数据进行操作。
游标可以在存储过程或触发器中使用,以实现对数据的逐行处理。
3.游标的使用方法SQL Server中使用游标需要经过以下几个步骤:1) 声明游标:使用DECLARE语句声明游标,并定义游标的属性,如游标的名称、数据集的名称等。
2) 打开游标:使用OPEN语句打开游标,将数据集的内容加载到游标中,以供后续的处理。
3) 读取数据:使用FETCH语句逐行读取游标中的数据,处理每一行数据。
4) 关闭游标:使用CLOSE语句关闭游标,释放与游标相关的资源。
5) 销毁游标:使用DEALLOCATE语句销毁游标,释放游标占用的内存。
4.游标的使用例子下面通过一个简单的例子来介绍SQL Server游标的使用方法。
假设有一个名为"Employee"的表,表中包含员工的ID、尊称和薪水等字段。
现在需要计算每个员工的薪水涨幅,并将结果输出。
可以通过游标来实现这个需求。
```sql-- 声明变量DECLARE EmployeeID INT, EmployeeName NVARCHAR(50), Salary DECIMAL(10, 2), Increment DECIMAL(10, 2)-- 声明游标DECLARE employee_cursor CURSOR FORSELECT EmployeeID, EmployeeName, SalaryFROM Employee-- 打开游标OPEN employee_cursor-- 读取数据FETCH NEXT FROM employee_cursor INTO EmployeeID, EmployeeName, SalaryWHILE FETCH_STATUS = 0BEGINSET Increment = Salary * 0.1 -- 假设薪水涨幅为10PRINT 'Employee ' + EmployeeName + '''s salary will increase by ' + CONVERT(NVARCHAR(20), Increment)FETCH NEXT FROM employee_cursor INTO EmployeeID, EmployeeName, SalaryEND-- 关闭游标CLOSE employee_cursor-- 销毁游标DEALLOCATE employee_cursor```以上代码中,首先声明了一些变量,然后声明了游标"employee_cursor",并使用SELECT语句将"Employee"表中的数据加载到游标中。
目录SqlServer游标实例介绍利用游标逐行更新、存储SqlServer游标及其循环语句游标概念及其使用方法游标语句学习笔记SQLServer中游标实例介绍引言我们先不讲游标的什么概念,步骤及语法,先来看一个例子:表一OriginSalary表二AddSalary现在有2张表,一张是OriginSalary表--工资表,有三个字段0_ID员工号(NVARCHAR)、O_Name员工姓名(NVARCHAR)、O_Salary工资(FLOAT)。
另一张表AddSalary表—加薪表。
有2个字段,O_ID员工号、A_Salary增加工资。
两张表的O_ID是一一对应的,现在求将加薪的工资+原来的工资=现在的工资,也就是O_Salary=O_Salary+A_Salary,修改表OriginSalary的工资字段。
对于一些不熟悉游标的程序员来说,这个并不是什么很难的问题,这个问题用程序来实现可能也很简单。
我先说说,用程序解决这个问题的思路:1.先获得表OriginSalary的记录数,写个循环。
2.写SQL语句“select*from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID”获得视图。
3.使用Dataset获得O_Salary=O_Salary+A_Salary。
4.写UPDATE语句“update OriginSalary set O_Salary=”相加的值”where O_ID=”获得值”5.循环3次,完成此功能。
还有一种方法就是写存储过程,在这里我就不列出来了。
我想大家在学习游标之前好好想想这个问题,及一些批量处理的例子。
可能有的人会说:“难道数据库不能一行一行的处理数据吗?将表AddSalary的数据逐行的取出,然后表OriginSalary数据逐行的修改?”答案当然是肯定。
这就是游标概念。
接下来的一章我们会好好的讲讲什么是游标?我会用游标来解决刚才留给大家的问题。
今天简单的总结一下PL/SQL中cursor(光标/游标)的用法.相信不少做开发或维护的DBA在找工作的时候,遇到过类似的面视问题:请简单的描述一下光标的类型,说一下普通光标和REF光标之间的区别,以及什么时候该正确应用哪一个?这个题目,我着实难住了不少人,其实他们在具体开发的时候,也还是比较能够把握正确的光标的使用的,但就是说不出来,当然了,这与大家自身的沟流交通能力是有关系的。
有的人不善于说,但做的却很好。
扯的扯就走远了,最后唠叨一下:做技术这条路,能干不能说,或者说会干不会包装,路是走不"远"的.显式cursor显式是相对与隐式cursor而言的,就是有一个明确的声明的cursor.显式游标的声明类似如下(详细的语法参加plsql ref doc )cursor cursor_name (parameter list) is select ...游标从declare、open、fetch、close是一个完整的生命旅程。
当然了一个这样的游标是可以被多次open进行使用的,显式cursor是静态cursor,她的作用域是全局的,但也必须明白,静态cursor也只有pl/sql代码才可以使用她。
下面看一个简单的静态显式cursor的示例:declarecursor get_gsmno_cur (p_nettype in varchar2) is select gsmnofrom gsm_resourcewhere nettype=p_nettype and status='0'; v_gsmno gsm_resource.gsmno%type;beginopen get_gsmno_cur('139');loopfetch get_gsmno_cur into v_gsmno;exit when get_gsmno_cur%notfound; dbms_output.put_line(v_gsmno);end loop;close emp_cur;open get_gsmno_cur('138');loopfetch get_gsmno_cur into v_gsmno;exit when get_gsmno_cur%notfound; dbms_output.put_line(v_gsmno);end loop;close get_gsmno_cur;end;/上面这段匿名块用来实现选号的功能,我们显式的定义了一个get_gsmno_cur,然后根据不同的号段输出当前系统中该号短对应的可用手机号码。
SQL游标原理和使用方法在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。
不过我们常常会遇见这样情况,即从某一结果集中逐一地读取一条记录。
那么怎么解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。
1.1 游标和游标的好处在数据库中,游标是个十分重要的概念。
游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
游标总是和一条T_SQL 选择语句相关联因为游标由结果集(能是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。
当决定对结果集进行处理时,必须声明一个指向该结果集的游标。
如果原来用 C 语言写过对文件进行处理的程式,那么游标就像你打开文件所得到的文件句柄相同,只要文件打开成功,该文件句柄就可代表该文件。
对于游标而言,其道理是相同的。
可见游标能够实现按和传统程式读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程式。
我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。
因此我们必须借助于游标来进行面向单条记录的数据处理。
由此可见,游标允许应用程式对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;他还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程式设计两者联系起来,使两个数据处理方式能够进行沟通。
1.2 游标种类MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。
(1)Transact_SQL 游标Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。
Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。
Transact_SQL 游标不支持提取数据块或多行数据。
(2)API 游标API 游标支持在OLE DB,ODBC 及DB_library 中使用游标函数,主要用在服务器上。
每一次客户端应用程式调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL)都会将这些客户请求传送给服务器以对API游标进行处理。
(3)客户游标客户游标主要是当在客户机上缓存结果集时才使用。
在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。
客户游标仅支持静态游标而非动态游标。
由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。
因为在一般情况下,服务器游标能支持绝大多数的游标操作。
由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。
在本章中我们主要讲述服务器(后台)游标。
select count(id) from infoselect * from info--清除所有记录truncate table infodeclare @i intset @i=1while @i<1000000begininsert into info values(’Justin’+str(@i),’深圳’+str(@i))set @i=@i+1end1.3 游标操作使用游标有四种基本的步骤:声明游标、打开游标、提取数据、关闭游标。
声明游标象使用其他类型的变量相同,使用一个游标之前,首先应当声明他。
游标的声明包括两个部分:游标的名称;这个游标所用到的SQL语句。
如要声明一个叫作Cus-tomerCursor的游标用以查询地址在北京的客户的姓名、帐号及其余额,你能编写如下代码:DECLARE CustomerCursor CURSOR FORSELECT acct_no,name,balanceFROM customerWHERE province="北京";在游标的声明中有一点值得注意的是,如同其他变量的声明相同,声明游标的这一段代码行是不执行的,你不能将debug时的断点设在这一代码行上,也不能用IF...END IF语句来声明两个同名的游标,如下列的代码就是错误的。
IF Is_prov="北京"THENDECLARE CustomerCursor CURSOR FORSELECT acct_no,name,balanceFROM customerWHERE province="北京";ELSEDECLARE CustomerCursor CURSOR FORSELECT acct_no,name,balanceFROM customerWHERE province〈〉"北京";END IF打开游标声明了游标后在作其他操作之前,必须打开他。
打开游标是执行和其相关的一段SQL语句,例如打开上例声明的一个游标,我们只需键入:OPEN CustomerCursor;由于打开游标是对数据库进行一些SQL SELECT的操作,他将耗费一段时间,主要取决于你使用的系统性能和这条语句的复杂程度。
如果执行的时间较长,能考虑将屏幕上显示的鼠标改为hourglass。
提取数据当用OPEN语句打开了游标并在数据库中执行了查询后,你不能即时利用在查询结果集中的数据。
你必须用FETCH语句来取得数据。
一条FETCH语句一次能将一条记录放入程式员指定的变量中。
事实上,FETCH 语句是游标使用的核心。
在DataWindow和DataStore中,执行了Retrieve()函数以后,查询的所有结果全部能得到;而使用游标,我们只能逐条记录地得到查询结果。
已声明并打开一个游标后,我们就能将数据放入任意的变量中。
在FETCH语句中你能指定游标的名称和目标变量的名称。
如下例:FETCH CustmerCur-sorINTO:ls_acct_no,:ls_name,:ll_balance;从语法上讲,上面所述的就是一条合法的取数据的语句,不过一般我们使用游标却还应当包括其他的部分。
正如我们前面所谈到的,游标只能一次从后台数据库中取一条记录,而在多数情况下,我们所想要作的是在数据库中从第一条记录开始提取,一直到结束。
所以我们一般要将游标提取数据的语句放在一个循环体内,直至将结果集中的全部数据提取后,跳出循环圈。
通过检测SQLCA.SQL-CODE的值,能得知最后一条FETCH语句是否成功。
一般,当SQLCODE值为0时表明一切正常,100表示已取到了结果集的末尾,而其他值均表明操作出了问题,这样我们能编写以下的代码:lb_continue=Truell_total=0DO WHILE lb_continueFETCH CustomerCur-sorINTO:ls_acct_no,:ls_name,:ll_balance;If sqlca.sqlcode=0 Thenll_total+=ll_balanceElselb_continue=FalseEnd IfLOOP循环体的结构有多种,这里提到的是最常见的一种。
也有的程式员喜爱将一条FETCH语句放在循环体的前面,循环体内再放置另外一条FETCH语句,并检测SQLCA.SQLCODE是否为100。
不过这样做,维护时需同时修改两条FETCH语句,稍麻烦了些。
关闭游标在游标操作的最后请不要忘记关闭游标,这是个好的编程习惯,以使系统释放游标占用的资源。
关闭游标的语句非常简单:CLOSE CustomerCursor;使用Where子句子我们能动态地定义游标中的Where子句的参数,例如在本例中我们是直接定义了查询省份是北京的记录,但也许在应用中我们要使用一个下拉式列表框,由用户来选择要查询的省份,我们该怎样做呢?我们在前面原来提到过,DECLARE语句的作用只是定义一个游标,在OPEN语句中这个游标才会真正地被执行。
了解了这些,我们就能非常方便地实现这样的功能,在DECLARE的Where子句中加入变量作参数,如下所示:DECLARE CustomerCursor CURSOR FORSELCECT acct_no,name,balanceFROM customerWHERE province=:ls_province;∥定义ls_province的值OPEN CustomerCursor;游标的类型同其他变量相同,我们也能定义游标的访问类型:全局、共享、实例或局部,游标变量的命名规范建议也同其他变量相同。
--声明游标declare my_cursor cursor keyset for select * from info--删除游标资源deallocate my_cursor--打开游标,在游标关闭或删除前都有效open my_cursor--关闭游标close my_cursor--声明局部变量declare @id int,@name varchar(20),@address varchar(20)--定位到指定位置的记录fetch absolute 56488 from my_cursor into @id,@name,@addressselect @id as id,@name as name,@address as address--定位到当前记录相对位置记录fetch relative -88 from my_cursor into @id,@name,@addressselect @id as id,@name as name,@address as address--定位到当前记录前一条fetch prior from my_cursor into @id,@name,@addressselect @id as id,@name as name,@address as address--定位到当前记录后一条fetch next from my_cursor into @id,@name,@addressselect @id as id,@name as name,@address as address--定位到首记录fetch first from my_cursor into @id,@name,@addressselect @id as id,@name as name,@address as address--定位到尾记录fetch last from my_cursor into @id,@name,@addressselect @id as id,@name as name,@address as address实例:use database1declare my_cursor cursor scroll dynamic/**//*scroll表示可随意移动游标指针(否则只能向前),dynamic表示能读写游标(否则游标只读)*/forselect productname from productopen my_cursordeclare @pname sysnamefetch next from my_cursor into @pnamewhile(@@fetch_status=0)beginprint ’Product Name: ’ + @pnamefetch next from my_cursor into @pnameendfetch first from my_cursor into @pnameprint @pname/**//*update product set productname=’zzg’ where current of my_cursor *//**//*delete from product where current of my_cursor */close my_cursordeallocate my_cursor1.4 游标的高级技巧尽管目前基于SQL语句的后台数据库所支持的语言都大致相当,但对游标的支持却有着一些差异,例如对滚动游标支持。