使用游标(Cursors)将多行查询结果逐行处理
一、首先介绍游标的功能、相应的操作命令、变量及工作流程
游标(cursor)主要功能是用select查询语句,得到的多行数据结果,一次一行地送至需要调用的存储过程或宿主 程序中,最初游标指向第一行数据,将这行数据送至存储过程或宿主 程序中,然后游标又指向下一行数据,这样一直循环下去,直至所有的数据全部调用完毕,它可以方便灵活地修改或删除游标所在行的数据。
游标的机制由以下五条语句及两个全局变量来完成。
1、说明语句。对一个游标进行命名,并将它与相应的查询语句相联系。
语法是:declare cursor_name cursor for select_statement
其中:select_statement是一个SELECT语句,这个语句返回多行结果数据,它不允许有INTO子句和COMPUTE子句存在。
2、打开游标语句。执行与游标相联系SQL查询语句,并将查询结果置于游标中。
语法是:open cursor_name
3、取数语句。用来从打开的游标中检索数据,并将这些数据赋给宿主变量。在每次执行取数语句时,首先将游标向前推进一位,然后按照游标当前位置取一值,并对相应变量赋值。
语法是:fetch cursor_name int host_ vavriable,……
4、关闭游标语句。当取数完毕或者发生错误时,一定要关闭游标。否则下次调用游标将出错。
语法是:close cursor_name
5、 删除游标语句,该语句主要是将游标调用的内存资源释放。
语法是:dellocate cursor_name
全局变量:@@rowcount;使用取数语句返回行值数。
@@sql status 取数返回状态变量,值有三个:
0表示取数成功。
1表示取数结果错误。
2表示没有可取的数。
游标的工作流程图如下:
二、接下来这个程序是我运用游标功能,编写的计算定期存款应付利息的程序。
该程序由两个存储过程组成,需要调用定期存款表(t_dqcd)和利率表(t_ll)的数据,由于每笔存款金额、存期、适用利率、开户日不同,在进行计算定期存款应付利息时,只能按户逐笔进行。
第一个存储过程主要是执行游标操作语句,提出输入参数“帐号”,并调用存储过程“单帐号应付利息”,得出输出参数“单帐户利息值”,并对其进行累加,直到算出所有帐户的应付利息。
具体程序如下:
print 'install yflx.....'
go
drop proc yflx
go
create proc yflx
@we money output
as
declare c1 cursor for /*说明游标C1 */
select wh from t_dqcd where zhzt <> '1'
declare @iwh char(9)
declare @wh char(9)
declare @hzs char(12)
declare @ff money
declare @jj money
open c1 /*打开游标*/
select @jj = 0.00 /*赋初值为0*/
fetch c1 into @iwh /*提出游标数据给变量*/
while @@sqlstatus != 2
begin
if @@sqlstatus =1
begin
raiserror 20001 "select fail"
return
end
exec dhlx @wh=@iwh,@dhlx=@ff output /*调动存储过程*/
select @jj = @jj + @ff
fetch c1 into @iwh
end
select @we = @jj/*将汇总数付给输出变量*/
close c1/*关闭游标*/
deallocate cursor c1/*删除游标*/
go
第二个存储过程主要根据游标所提取的帐号运用sql查询语句,算出实际存期和当时挂牌利率,最终算出该帐户的应付利息。
计算公式为:
未到期定期储蓄存款
应付利息=本金×实际天数×存入时挂牌利率
逾期定期储蓄存款
应付利息=本金×存期×存入入时挂牌利率+本金×逾期天数×现行活期挂牌利率
具体程序如下:
print 'install dhlx .....'
go
drop proc dhlx
go
create proc dhlx
@wh char(9),
@dhlx money output
as
declare @ts smallint
declare @yflx money
declare @cts char(9)
declare @hqll float
declare @bcc char(5)
declare @zhbcc char(2)
declare @sbcc smallint
declare @khrq smallint
select @bcc=bcc from t_dqcd where wh=@wh
select @zhbcc=substring(@bcc,3,2)
select @sbcc= convert(int,@zhbcc)
select @ts=(datediff(mm,(select qxr from t_dqcd where wh =@wh),getdate())*30 + datepart(dd,getdate()) - datepart(dd, (select qxr from t_dqcd where wh=@wh))) from t_dqcd where wh=@wh /*计算实际存取天数*/
select @cts = convert(char, @ts)
select @hqll=ll from t_ll where bcc='12000' and rq=(select max(rq) from t_ll)
if @ts < @sbcc*30 /*检查该存款是否到期*/
select @yflx=round(((select bjje from t_dqcd where wh=@wh)*(select ll from t_ll where bcc=(select bcc from t_dqcd where wh=@wh)and rq=(select max(rq) from t_ll where bcc=(select bcc from t_dqcd where wh =@wh) and rq !> (select khr from t_dqcd where wh=@wh)))*(datediff(mm,(select qxr from t_dqcd where wh
=@wh),getdate())*30 + datepart(dd,getdate()) - datepart(dd,(select qxr from t_dqcd where wh=@wh)))/30000),2) from t_dqcd where wh=@wh
else
select @yflx=round((((select bjje from t_dqcd where wh=@wh)*(select ll from t_ll where bcc=(select bcc from t_dqcd where wh=@wh)and rq=(select max(rq) from t_ll where bcc=(select bcc from t_dqcd where wh =@wh) and rq !> (select qxr from t_dqcd where wh=@wh)))*@sbcc)/1000+((select bjje from t_dqcd where wh=@wh)*@hqll*(@ts-@sbcc*30))/30000),2) from t_dqcd where wh=@wh
select @dhlx=@yflx
go
总结:由于在程序中用游标对多行查询结果进行逐行处理,保证了使用SYBASE数据库查询语句进行子查询时返回值唯一,使整个程序结构简练、条理清晰。
使用游标(Cursors)将多行查询结果逐行处理相关推荐
- [导入]在SYBASE数据库中使用游标(Cursors)将多行查询结果进行逐行处理
在SYBASE数据库中使用游标(Cursors)将多行查询结果进行逐行处理 2000-08-16 14:47:33 在SYBASE数据库中,说明性数据库语言(SQL)是目前首推的最成功,应用最广泛的数 ...
- arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新
风过无痕 原文 arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 深入理解游标Cursors,实现数据的快速查找,插入,删除,更新 1.查找数据Search Cu ...
- Go 学习笔记(55)— Go 标准库 sql (初始化数据库、插入、更新、删除数据库表、单行查询、多行查询、事务处理)
1. 标准库说明 Go 的标准库中是没有数据库驱动,只提供了驱动接口,有很多第三方实现了驱动,我们这里选择 go-sql-driver 这个实现是目前使用最多的.github 地址是:https:// ...
- e站host地址_Linux系统怎么使用命令行查询公网IP地址
请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 本文主要讲解Linux系统怎么使用命令行查询公网IP地 ...
- MySQL命令行查询乱码解决方法:
MySQL命令行查询乱码解决方法: 参考文章: (1)MySQL命令行查询乱码解决方法: (2)https://www.cnblogs.com/aksir/p/7070493.html 备忘一下.
- 尾号限行 API 实现微信小程序车辆尾号限行查询功能
引言 车辆尾号限行是一个交通出行政策,根据地方交通管理政策,在一周内的某一天,该尾号车辆不允许在规定路段行驶.这种政策不是针对特定道路和特定车辆,是在一定区域内对所有车辆都具有制约能力,而且会不定期调 ...
- 尾号限行api,单双号限行查询数据库接口调用代码示例
尾号限行一直是一个非常态的交通管制方式,在APP中集成尾号限行查询,消息推送机主今天是否限行是非常不错的.此尾号限行API集成北京.天津.兰州.杭州.长春.南昌.成都.贵阳的尾号限行数据.支持查询今日 ...
- 对于一万条数据量使用Oracle游标,存储过程,一般查询的速度的对比
一,创建ID自增长表格 1,创建序列 create sequence my_em_seq --序列名minvalue 1--最小值maxvalue 99999999999999999999999999 ...
- java mongodb 查询 游标_MongoDB find()方法:查询数据
在关系型数据库中,可以实现基于表的各种各样的查询,以及通过投影来返回指定的列,相应的查询功能也可以在 MongoDB 中实现.同时由于 MongoDB 支持嵌套文档和数组,MongoDB 也可以实现基 ...
最新文章
- 自动sqlldr脚本
- [转] 为什么javascript是单线程的却能让AJAX异步调用?
- 常见的java内存溢出情况
- HandlerThread 类的学习(转载)
- 使用Advanced Installer进行二次打包
- 上几个WebAPI就算微服务架构?Too Young!
- 如何:优化Hive ZooKeeper Lock Manager实施
- 简单Linux磁盘管理
- Codeforces 708D 上下界费用流
- 字符串函数rpartition与partition
- matlab 频率分布直方图_小葱品题丨高考必考内容—频率分布直方图?!教你三步得满分!...
- SQL server 2008 如何卸载干净
- div之间横竖方向的5px间距
- 一张图解AlphaGo原理及弱点
- 正则表达式(用户名表单验证/验证座机号码/正则替换replace)
- Excel查找快捷键:Ctrl+F
- 超级节点的困境,社区治理的尴尬 |链捕手
- 计算机自动关机启机唤醒设置,电脑定时自动关机怎么设置
- 轮式移动机器人轨迹跟踪的MATHLAB程序,运用运动学和动力学模型的双闭环控制
- horovod 安装及使用
热门文章
- [SQL Server 2005 至 SP3] 问题解决: 发布'xxx'的初始快照尚不可用
- label中的for属性
- HTML|文本框和单选框
- Java毕设设计进销存仓库管理系统springboot+mybatis+easyui
- MongoDB笔记记录(雷哥课堂)–索引
- 工业互联网蓬勃发展,出奇才能制胜
- 参考文献类型字母的含义
- atoi,itoi,atol,strtol, strtod函数转换
- 短视频推广转到直播领域,探店达人做好直播的秘诀是什么
- linux系统chromium设置中文,在linux上使用更新替代设置Chromium作为默认的web浏览器...