Chinaunix

标题: sybase 多行游标更新问题 [打印本页]

作者: daidai8910    时间: 2011-02-10 13:43
标题: sybase 多行游标更新问题
本人使用sybase ase一年有余,近日有个问题,咨询下坛子里的高人,麻烦不吝赐教:
系统中有只程序专门负责处理每天的交易数据,查询并不快,想通过使用宽游标,也就是多行游标来减少io操作,但是本人以前没有写过宽游标的程序,对于宽游标下如何更新数据莫不着头绪,有哪位写过这方面的程序,希望能贴出段代码来给小弟学习学习,若没有代码,麻烦告知从哪里可以下到资料自己学习也行,先谢过了
作者: Eisen    时间: 2011-02-10 16:51
本帖最后由 Eisen 于 2011-02-10 17:07 编辑

提醒一点: Sybase上不推荐使用cursor,因为效率很低,所以推荐你使用临时表的方式来解决,这样效率高。

另外,如果你实在要用,可以用 set cursor rows number for cursor_name 这样子的语句来让fetch每次返回多行。
作者: daidai8910    时间: 2011-02-11 10:29
谢谢eisen的回复,我现在的问题是,取出来可以是多行,但是我想把取到数组内的数据批量存回数据库(如果没有批量存回的话,使用游标定位回到多行的起点也行),因为业务逻辑较多,较复杂,使用临时表来存取数组实现难度太大,再次感谢
作者: daidai8910    时间: 2011-02-11 10:30
谢谢eisen的回复,我现在的问题是,取出来可以是多行,但是我想把取到数组内的数据批量存回数据库(如果没有批量存回的话,使用游标定位回到多行的起点也行),因为业务逻辑较多,较复杂,使用临时表来存取数组实现难度太大,再次感谢
作者: eisen    时间: 2011-02-11 12:59
感觉不现实……
fetch可以一次取多行,但指针只能指向最后一行,你怎么update回去啊?
作者: daidai8910    时间: 2011-02-12 14:58
我主要就是不晓得如何更新回去,因为处理的这张表是交易流水表,在得到的多行数据中没有办法定位一条记录,但是这些流水又必须加上是否处理的标志位(业务要求),麻烦再帮忙看看是否有这方面的资料??
作者: daidai8910    时间: 2011-03-06 17:41
自己顶起来,期望高人指条明路
作者: zcjzcx    时间: 2011-03-08 21:14
是否可以取出要更新行的key值, 存到一个字串变量keylist, 然后 更新key值 in keylist,fecth 一次 1个update 。  仅供参考, 说错莫怪。
作者: chenfeng825    时间: 2011-03-09 08:51
cursor就是慢,还有锁定,甚至完整性问题。总之就是能不用就不用。。。。
什么逻辑?除了cursor无解?看到都提到多行更新了。。。
作者: daidai8910    时间: 2011-03-19 09:12
前几日工作任务比较重,没有时间上来回复了。
其实逻辑是这样的:
   有一只批量程序会读取当天的交易流水信息,并且将交易流水信息加工用于更新另外两张业务表,在处理完一条流水信息后,会将本条流水的是否处理标志更新(主要是为了支持重提批量,下次提起批量的时候,可以只取那些没有做过更新的流水),因为是流水表,所以并没有主键。
  此程序现阶段处理时间较慢,想优化之,初步想法是使用多行游标提取数据,但是因为游标指针只能指到最后一行,因此无法进行批量更新标志位(宽游标内的)的操作。
ps:谢谢楼上两位的回复。
作者: Eisen    时间: 2011-03-21 09:06
哇。这不简单啊……先抽取到一个临时表里,一个while循环,里面第一句set rowcount 50
然后update你的那个临时表,等到临时表处理完了,照样update回你的流水表不就完了。
作者: daidai8910    时间: 2011-03-21 20:46
回复 11# Eisen


    流水表没有主键,更新回去不容易




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2