0

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

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;
4

2 回答 2

1

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

于 2012-04-23T13:59:07.480 回答
1

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

  1. 使用全局临时表。更新这个,再次查询,然后把所有东西都放在你的实际表中——我不太喜欢这条路线,但它会做你想做的。

  2. 将您的数据批量收集到用户定义的类型中,并使用其中的值来计算您想要的。类似于以下内容。这样做的好处是在表上执行的 DML 更少,并且您可以使用 rowid 进行更新,因此更新会更快。

    declare
    
       cursor cur_scn is
        SELECT rowid as rid, TRIP_ID, TRAIN_ID, STATION_ID, ETA
          FROM TRIP_DTL
         WHERE ....
         ORDER BY SOMETHING;
    
        type t__scn is table of cur_scn%rowtype index 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.last loop
          t_scn(i).eta := t_scn(i - 1).eta + business_logic;
       end loop;
    
       forall 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;
    
  3. 我真的不喜欢您必须始终更新所有内容的方式,但是我无法想到更好的存储数据的方法,但是您应该进行调查。

于 2012-04-23T19:48:26.593 回答