在SYBASE数据库中使用游标(Cursors)将多行查询结果进行逐行处理
2000-08-16 14:47:33

  在SYBASE数据库中,说明性数据库语言(SQL)是目前首推的最成功,应用最广泛的数据库语言,它已成为关系型数据库语言的国际标准。这主要得益于它的两大优点:一是免除了用户描述操作过程的麻烦,而将其转嫁给系统,系统可根据用户所提出的要求,确定一个有效的操作过程,二是其语言本身接近英语的自然语言,易学易用,很受用户欢迎。尽管如此,SQL语言一般局限于对数据库的操作,本身不是计算完备的语言,如在变量类型上不像高级程序设计语言(如:C语言)有如数组、指针等一些复杂变量类型;另外该语言是面向集合的语言(set_oriented languase),即执行一条语句可以一次性地提供所需的所有元组,可是在实际编程时我们需要对这些元组逐个地赋值给相关变量,根据条件分别处理。目前解决此类问题办法是将SQL语言嵌入到高级程序设计语言中,利用高级程序设计语言处理数据能力强的优点,与SQL语言对数据库直接操作的特点相结合,共同完成,这在一定程度上,既增加编写程序的难度,又使整个程序繁琐。下面我向大家介绍在新版SYBASE数据库中,增加的工具游标,使用它可以方便地实现将多行查询结果进行逐行处理。

一、首先介绍游标的功能、相应的操作命令、变量及工作流程

  游标(cursor)主要功能是用select查询语句,得到的多行数据结果,一次一行地送至需要调用的存储过程或宿主程序中,最初游标指向第一行数据,将这行数据送至存储过程或宿主程序中,然后游标又指向下一行数据,这样一直循环下去,直至所有的数据全部调用完毕,它可以方便灵活地修改或删除游标所在行的数据。

游标的机制由以下五条语句及两个全局变量来完成。

1、说明语句。对一个游标进行命名,并将它与相应的查询语句相联系。

语法是:declare cursor_name cursor for select_statement

其中:select_statement是一个SELECT语句,这个语句返回多行结果数据,它不允许有INTO子句和COMPUTE子句存在。

2、打开游标语句。执行与游标相联系SQL查询语句,并将查询结果置于游标中。

语法是:open cursor_name

3、取数语句。用来从打开的游标中检索数据,并将这些数据赋给宿主变量。在每次执行取数语句时,首先将游标向前推进一位,然后按照游标当前位置取一值,并对相应变量赋值。

语法是:fetch cursor_name into: 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数据库查询语句进行子查询时返回值唯一,使整个程序结构简练、条理清晰。

  摘自《赛迪网》 米晓华/文

http://tech.china.com/zh_cn/netschool/programme/sybase/4021/20000816/220619.htm

文章来源:http://computer.mblogger.cn/wucountry/posts/41605.aspx

[导入]在SYBASE数据库中使用游标(Cursors)将多行查询结果进行逐行处理相关推荐

  1. 使用游标(Cursors)将多行查询结果逐行处理

    在SYBASE数据库中,说明性数据库语言(SQL)是目前首推的最成功,应用最广泛的数据库语言,它已成为关系型数据库语言的国际标准.这主要得益于它的两大优点:一是免除了用户描述操作过程的麻烦,而将其转嫁 ...

  2. Sql Server数据库数据导入到SQLite数据库中

    背景:Sql Serve数据库中有个表格A,想把数据导入到SQLite数据库中 工具下载地址:点击打开链接 用法: 原作者地址及下载地址:点击打开链接

  3. 什么是mysql的游标_数据库中的游标到底是什么意思

    数据库中的游标到底是什么意思 关注:177  答案:2  mip版 解决时间 2021-01-15 20:54 提问者更无风月 2021-01-15 15:53 数据库中的游标到底是什么意思 最佳答案 ...

  4. 通过设置rowcount,从Sybase数据库中分页取数

    http://bijian1013.iteye.com/blog/1830421 虽然听说Sybase12.5.3版本以上的已经支持top查询了,但现在还是有很多系统用的是比较老的Sybase数据库, ...

  5. redis和sqlserver数据同步_SQLServer数据库之redis数据库的数据导入到SQLServer数据库中...

    本文主要向大家介绍了SQLServer数据库之redis数据库的数据导入到SQLServer数据库中,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. #!/usr/bin/ ...

  6. sybase数据库中时间类型转换以及比较

    一. 时间转换 Sybase 时间处理Convert 的使用 1. 怎样将datetime类型的日期转换为yyyy-mm-dd格式 SELECT STR_REPLACE(CONVERT(VARCHAR ...

  7. 1. 将数据导入到前置数据库中(MySQL)

    1. 将数据导入到前置数据库中(MySQL) 然后我们在用阿里云的开源工具datax将数据拉取到hive中 1.1 注意事项 在导入到MySQL中时导入的路径只能使用双斜线( \\ )如: --导入数 ...

  8. java excel 导入 关闭,excel关联别的表格数据库-java实现excel表导入,有的字段数据库中没有,需要关......

    excel中我想用另一张表的内容我数据库,当我在一个... 用VLOOKUP函数,=VLOOKUP(lookup_value,table_array,col_index_num,range_looku ...

  9. 三步搞定oracle 11G 导出的pmd文件,导入oracle 12C数据库中

    将oracle 11G 导出的pmd文件,导入oracle 12C数据库中,将面临数据库用户名不匹配问题,12C用户名必须前缀c##,而导出的pmd文件又带原始11G数据库的用户名,无法在12C中建不 ...

最新文章

  1. RESTful架构和RESTful API设计总结
  2. Jenkins 管理界面里提示“反向代理设置有误“的问题解决办法
  3. 【项目管理】绩效域-工件裁剪对照(绩效维度)
  4. C++中事件机制的简洁实现
  5. 【CodeForces - 574D】Bear and Blocks (dp,思维)
  6. 什么是WebSocket,以及如何在Python中使用它?
  7. RabbitMQ事务和Confirm发送方消息确认——深入解读
  8. 【计算机网络】链路与连通
  9. ArcGiS/ArcInfo/ArcEditor/ArcMap/ArcView的区别
  10. 台式安装nas系统_个人云盘搭建延伸二:我也可以搭建NAS!黑群辉系统安装配置及测试...
  11. win7安装iis错误解决方法汇总
  12. 标题采集软件-免费标题生成器
  13. PS 如何制作Vista的毛玻璃效果
  14. 全球对冲基金及其投资策略解析
  15. pandas批量处理体育成绩
  16. JavaScript-修炼之路第五层
  17. 如何使用 ChatGPT/open ai 接口 进行图片生成(绘画、图片创作)
  18. 华为Java编码规范
  19. kubernetes pod-name生成过程 源码分析
  20. 用于制作电视广告和音乐视频的计算机,基于BS方式实现视音频编辑的系统及方法专利_专利查询 - 天眼查...

热门文章

  1. 如何使用 volatile, synchronized, final 进行线程间通信
  2. [系列教程] Discuz模板的制作方法
  3. MYSQL 慢查询日志分析
  4. windows和linux 修改 hosts的路径
  5. extract($_POST[])
  6. 14.json文件读取
  7. C++两种单例(饿汉式,懒汉式)
  8. 如何针对业务设计架构?——QCon热点专题前瞻
  9. 从Clarifai的估值聊聊深度学习
  10. Kivy: Crossplatform Framework for NUI