建设工作站服务器
引言
有关游标的概念、步骤和语法,请首先查看一个示例。
表OriginSalary表添加销售
现在有两个表。 一个是OriginSalary表。 工资表包含三个字段:0_ID员工编号( NVARCHAR )、O_Name员工姓名( NVARCHAR )和O_Salary工资( FLOAT )。
另一个表AddSalary表-加薪表。 有两个字段。 O_ID员工号码,A_Salary提高工资。 两张表的O_ID是一一对应的,求出当前加薪工资的原工资=当前工资,即O_Salary=O_Salary A_Salary,修改表中OriginSalary的工资字段。
对于不熟悉游标的程序员来说,这不是一个难题,用程序实现也可能很容易。 首先,让我谈谈通过ASP.NET程序解决这个问题的思路:
1 .首先获得表OriginSalary的记录数,写出周期。
2 .编写SQL语句“select * fromdbo.originsalaryasaleftjoindbo.addsalaryasbona.o _ id=b.o _ id”以获取视图。
使用Dataset获取O_Salary=O_Salary A_Salary。
写入与UPDATE语句“update OriginSalary set O_Salary=”相加的值“where O_ID=”获得值”
5 .循环三次,完成这个功能。
另一种方法是写存储过程,但这里不列出。
大家在学习光标之前,想仔细考虑这个问题和几个批量处理的例子。 有人问:“数据库不能逐行处理数据吗? 是否一次检索一行表AddSalary中的数据,一行更改表OriginSalary中的数据? ’当然,答案是肯定的。 这就是光标的概念。 在下一章里,你经常谈论什么是光标吗? 用光标解决刚才留给大家的问题。
1.1游标概念
游标( Cursor )允许用户逐行访问从SQL Server返回的结果集。 使用游标( cursor )的主要原因之一是将集合操作转换为单个记录处理方法。 用SQL语言从数据库中检索数据时,结果会放在内存空间中,通常是包含多条记录的集合。 游标机制允许用户在SQL server中逐行访问这些记录,并根据自己的意愿查看和处理这些记录。
1.2光标的优点
从游标定义中获得的游标优点如下: 这些优点在实际的APP中光标起着重要的作用。
1 )程序可以对查询语句select返回的行集中的每一行执行相同或不同的操作,而不是对整个行集执行相同的操作。
2 )提供根据光标位置删除和更新表中行的功能。
3 )游标实际上是连接集合指向数据库管理系统( RDBMS )和低指向编程的桥梁,这两种处理方法通过游标进行交流。
1.3使用游标
阐述了这个多光标的优点,现在我们亲自来揭开光标的神秘面纱。
使用光标的顺序为“声誉光标”、“打开光标”、“读取数据”、“关闭光标”和“删除光标”。
1.3.1游标声明
最简单的游标声明: DECLARE游标名称CURSOR FORSELECT语句;
其中,select语句可以是简单查询,也可以是复杂的连续查询或嵌套查询
例如: [以表2的2 AddSalary为例]
declaremycursorcursorforselect * fromaddsalary
就这样,我向表AddSalary声明了光标mycursor
【上级备注】
DECLARE游标名称[不敏感] [ scroll ] cursorforselect语句
本节介绍游标中级APP应用程序的[不敏感]和[滚动]
不敏感
表示MS SQL SERVER将游标定义中选定的数据记录存储在tempdb数据库下创建的临时表中。 对此游标的所有读取操作都将通过临时表进行响应。 因此,更改基表不会影响游标中提取的数据。 这意味着,如果基表的内容更改,游标不会更改,也无法使用游标更新基表。 如果不使用此保留字,则游标将反映对基本表的更新和删除。
此外,请注意,游标在以下情况下会自动设置不敏感选项:
在SELECT语句中使用DISTINCT、GROUP BY和HAVING UNION语句;
使用输出接头;
c .选定的任何表都没有索引
d .将实数值设置为选定行。
SCROLL
表示所有提取操作(如FIRST、LAST、PRIOR、NEXT、RELATIVE和ABSOLUTE )均可用。 不使用保留字时,只能进行NEXT提取操作。 这表明,SCROLL大大提高了数据提取的灵活性,可以自由读取结果集中任意行的数据记录,而无需关闭
重新开始光标。
1.3.2打开光标
很简单。 打开刚才声明的光标mycursor
OPEN mycursor
1.3.3数据读取
etch [ next|prior|from {光标名称| @光标变量名} [ INTO @变量名[,…] ]
参数说明:
NEXT下一行的数据,将下一行作为当前行。 当您打开游标时,第一次执行FETCH NEXT操作将检索游标集中的第一行数据,因为行指针指向游标的第一行之前。 NEXT是默认的光标提取选项。
INTO @变量名[,…]将提取操作的列数据放入局部变量。 列表中的每个变量都与游标结果集中的相应列从左到右相关联。 每个变量的数据类型必须与相应结果列的数据类型匹配,或者是结果列的数据类型所支持的隐式转换。 变量的数量必须与游标选择列表中的列数相匹配。
现在就取出mycursor光标的数据吧。
当游标打开时,行指针指向游标集中的第一行。 要读取游标集中的第一行数据,必须将行指针移动到指向第一行。 在本例中,可以通过以下操作读取第一行中的数据:
Eg: Fetch next from mycursor或Fetch first from mycursor
这样就取出了光标中的数据,但光是不够的。 需要将检索到的数据分配给变量
//声明两个变量
declare@o_idNvarchar(20 ) )。
declare @A_Salary float
//将检索到的值传递给刚才声明的两个变量
Fetch next from mycursor into @ O_ID,@ A_Salary
1.3.4关闭光标
CLOSE mycursor
1.3.5删除光标
戴尔我的cursor
1.3.6实例培训
以上介绍了使用光标的5个步骤。 那么,现在让我们举手,练习用光标取出表2的2 AddSalary的数据。
为了执行您自己创建的游标,您将游标写入了存储过程,以便可以轻松地查看游标的整个使用过程。
在sqlserver2000上创建新的存储过程:
CREATE PROCEDURE PK_Test
AS
//声明两个变量
declare@o_idNvarchar(20 ) )。
declare @A_Salary float
//声明游标mycursor。 select语句的参数数量必须与从游标中检索到的变量名相同
declaremycursorcursorforselecto _ id,A_Salary from AddSalary
//打开光标
open mycursor
//从光标中取出数据,代入刚才声明的两个变量
fetch next from mycursor into @O_ID,@A_Salary
//判断光标的状态
//0 fetch语句成功
//-1 fetch语句失败,或者此行不在结果集中
//-2提取的行不存在
while (@@fetch_status=0)
比根
//显示我们每次用光标取出的值
打印\\& amp; quot; 游标已成功检索到数据: quot;
print @O_ID
print @A_Salary
//用光标删除下一条记录
fetch next from mycursor into @O_ID,@A_Salary
结束
//关闭光标
close mycursor
//取消光标
deallocate mycursor
GO
我想通过上面的评论,我已经知道了光标的整个创建过程。 但是,我们至今仍是抽象的理解。 我们无论学什么知识,都要用在实践中。 这样我们就可以把抽象的东西具体化。
现在,我们运行这个存储过程,看看游标是如何取值的。
打开SQLSERVER2000查询分析器,创建数据库,然后运行存储过程
Exec PK_Test
看看效果吧(图)
在示例中,您会看到游标为每行检索值。 那么,先不要看下一个答案。 在引言部分,我试试刚才能不能把大家的问题留下来解决。
现在写一个解决我留下的问题的存储过程吧
创建进程PK _ salary add
AS
declare@o_idNvarchar(20,@A_Salary float
declaremycursorcursorforselecto _ id,A_Salary from AddSalary
open mycursor
fetch next from mycursor into @O_ID,@A_Salary
while(@@fetch_status=0)
比根
updateoriginsalaryseto _ salary=o _ salary @ a _ salarywhereo _ id=@ o _ id
fetch next from mycursor into @O_ID,@A_Salary
结束
close mycursor
戴尔我的cursor
GO
旧方法是使用查询分析器运行存储过程,并查看结果如何
Exec PK_SalaryAdd
看看效果吧(图)
运行存储过程以验证是否影响了三行中的数据
使用sql语句查看表OriginSalary的当前结果。
1.4结束语
如果你能把本教程读到最后,我会很高兴,但其实这只是光标最基础的应用。 在显示生活逻辑的关系中,可能会有更复杂的光标。 但是我们只有学会走路,才能跑步哦。
详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn