Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 更新显式游标_Oracle_Plsql_Cursor - Fatal编程技术网

Oracle 更新显式游标

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

我有一个光标,可以检索火车的行程细节。当我在记录中循环时,我会更新下一站的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;

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

正如前面所说,在游标for循环中无法“获取”新值,但是有办法解决这个问题

  • 使用一个。更新这个,再次查询,然后将所有内容放入实际的表中-我不太喜欢这条路线,但它可以满足您的需要

  • 将数据转换为用户定义的类型,并使用其中的值计算所需的内容。类似下面的内容。这样做的好处是在表上执行的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;
    
  • 我真的不喜欢你一直更新所有东西的方式,但是我想不出更好的存储数据的方式,但是你应该调查一下