首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Update Explicit游标

Update Explicit游标
EN

Stack Overflow用户
提问于 2012-04-23 21:07:10
回答 2查看 638关注 0票数 0

我有一个光标,它可以检索火车的行程细节。当我循环记录时,我更新下一站的到达时间( ETA )。同样,该值用于计算该车站的ETD (出发时间)。当记录获取该行程的下一个站点时,我希望使用更新后的ETA值来计算ETD,而不是在打开光标时使用旧值。这个是可能的吗?

代码语言:javascript
复制
CURSOR CUR_SCN IS
SELECT TRIP_ID,
TRAIN_ID,
STATION_ID,
ETA
FROM TRIP_DTL
WHERE ....;

FOR rec IN CUR_SCN
   calculate and update ETD for current rec.STATION_ID

   ld_eta := Business logic goes here for calculating next station ETA for the TRIP

   UPDATE TRIP_DTL
   SET ETA = ld_eta
   WHERE STATION_ID = next station
   AND TRIP_ID = rec.TRIP_ID;
END LOOP;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-24 03:48:27

正如Adam Hawkes'所说的,没有办法在游标for循环中“获取”新值,但是有一些方法可以解决这个问题。

  1. 使用global temporary table。更新这个,再次查询,然后把所有东西放到你的实际的表中-我真的不喜欢这个路线,但它会做你want.
  2. Bulk collect你的数据到一个用户定义的类型,并使用其中的值来计算你想要的东西。类似于下面的内容。这样做的好处是在表上执行的DML较少,并且您可以使用rowid进行更新,因此更新会更快。

声明游标cur_scn是SELECT rowid as rid,TRIP_ID,TRAIN_ID,STATION_ID,ETA FROM TRIP_DTL WHERE....ORDER by某物;类型t__scn是cur_scn%rowtype索引表BY binary_integer;t_scn t__scn;begin open cur_scn;fetch cur_scn bulk collect into t_scn;for I in t_scn.first + 1.结束循环t_scn(i).eta := t_scn(i - 1).eta + business_logic;结束循环;loop t_scn.last i in t_scn.first .t_scn.last update trip_dtl set eta = t_scn(i).eta where rowid = t_scn(i).rid;close cur_scn;end;

  • 我真的不喜欢你必须一直更新所有内容的方式,但我想不出更好的存储数据的方法,但你应该研究一下。
票数 1
EN

Stack Overflow用户

发布于 2012-04-23 21:59:07

当游标打开时,有一个固定的数据视图。获取“新”值的唯一方法是重新查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10281146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档