SQL游标

有2个表,
表A
[list]
[*]ID name salary
[*]1 小张 2000
[*]2 小王 1800
[*]3 小刘 2200
[*]4 小赵 2100
[*]5 小李 3000
[/list]
表B
[list]
[*]ID bonus
[*]1 500
[*]2 480
[*]3 400
[*]4 600
[*]5 1000
[/list]

表B与表A通过id相关联

现在希望数据表A中的所有salary等于salary加上表B中的bonus列总的和是当前的总工资,并更新到表A。

可以用视图来,表连接下就可以。
现在想让SQL自己来处理,游标就是很好的方法


原理:游标就是把数据按照指定要求提取查询出相应的数据集,然后再逐条对每一行数据进行处理。


1.1游标的概念
游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
1.2游标的优点
从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:
1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。
2)提供对基于游标位置的表中的行进行删除和更新的能力。
3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。
1.3游标的使用
使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。


1)、最简单游标声明:
DECLARE <游标名> CURSOR FOR<SELECT语句>;
其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询
如:

declare mycursor cursor for select * from tb_A

2)、打开游标
非常简单,我们就打开刚才我们声明的游标mycursor
如:

OPEN mycursor

3)、读取数据
FETCH [ NEXT | PRIOR | FIRST | LAST ] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]

参数说明:
NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。
INTO @变量名[,…] 把提取操作的列数据放到局部变量中。
列表中的各个变量从左到右与游标结果集中的相应列相关联。
各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。


4)、关闭游标

CLOSE mycursor

5)、删除游标

DEALLOCATE mycursor

具体例子



declare @id int --定义变量来保存ID号
declare @S float --定义变量来保存值
declare mycursor cursor for select * from tb_B --为所获得的数据集指定游标
open mycursor --打开游标
fetch next from mycursor into @id,@S --开始获得第一条数据
while(@@fetch_status=0) --如果数据集里一直有数据
begin
update tb_A set salary = (tb_A.salary + @S) where tb_A.id = @id
fetch next from mycursor into @id,@S --跳到下一条数据
end
close mycursor --关闭游标
deallocate mycursor --删除游标

Stkcd [股票代码] ShortName [股票简称] Accper [统计截止日期] Typrep [报表类型编码] Indcd [行业代码] Indnme [行业名称] Source [公告来源] F060101B [净利润现金净含量] F060101C [净利润现金净含量TTM] F060201B [营业收入现金含量] F060201C [营业收入现金含量TTM] F060301B [营业收入现金净含量] F060301C [营业收入现金净含量TTM] F060401B [营业利润现金净含量] F060401C [营业利润现金净含量TTM] F060901B [筹资活动债权人现金净流量] F060901C [筹资活动债权人现金净流量TTM] F061001B [筹资活动股东现金净流量] F061001C [筹资活动股东现金净流量TTM] F061201B [折旧摊销] F061201C [折旧摊销TTM] F061301B [公司现金流1] F061302B [公司现金流2] F061301C [公司现金流TTM1] F061302C [公司现金流TTM2] F061401B [股权现金流1] F061402B [股权现金流2] F061401C [股权现金流TTM1] F061402C [股权现金流TTM2] F061501B [公司自由现金流(原有)] F061601B [股权自由现金流(原有)] F061701B [全部现金回收率] F061801B [营运指数] F061901B [资本支出与折旧摊销比] F062001B [现金适合比率] F062101B [现金再投资比率] F062201B [现金满足投资比率] F062301B [股权自由现金流] F062401B [企业自由现金流] Indcd1 [行业代码1] Indnme1 [行业名称1] 季度数据,所有沪深北上市公司的 分别包含excel、dta数据文件格式及其说明,便于不同软件工具对数据的分析应用 数据来源:基于上市公司年报及公告数据整理,或相关证券交易所、各部委、省、市数据 数据范围:基于沪深北证上市公司 A股(主板、中小企业板、创业板、科创板等)数据整理计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值