Oracle 更新显式游标
我有一个光标,可以检索火车的行程细节。当我在记录中循环时,我会更新下一站的ETA(到达时间)。同样,该值用于计算该车站的ETD(发车时间)。我希望在记录获取该行程的下一站时,使用ETA的更新值来计算ETD,而不是打开光标时的旧值。这可能吗Oracle 更新显式游标,oracle,plsql,cursor,Oracle,Plsql,Cursor,我有一个光标,可以检索火车的行程细节。当我在记录中循环时,我会更新下一站的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
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;
当光标打开时,会有一个固定的数据视图。获取“新”值的唯一方法是重新查询。正如前面所说,在游标for循环中无法“获取”新值,但是有办法解决这个问题
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;