关于oracle 游标的 问题

我现在有两个表:
表a中的字段:ID,BJNO,Name,Datatime,type;
表b中的字段:ID,BJNO,Name,startdatatime,enddatatime,time_difference;

现在b表是空的,a表中有数据。

a表中的数据规则为: id唯一。bjno,name 对应,但是存在多条 bjno,name 相同的记录。type 只有两个值,一个是2,一个是5,5代表开始时间,2代表结束时间。

我现在的希望是,能够将这些记录,每一次的开始时间和结束时间对应起来。

a 表示例

ID BJNO name datatime type
1 Bj0001 1号报卷 2013-1-1 5
2 Bj0001 1号报卷 2013-1-2 2
3 Bj0002 2号报卷 2013-1-3 5
4 Bj0001 1号报卷 2013-1-4 5
5 Bj0002 2号报卷 2013-1-5 2

我希望可以 通过游标或其他oracle方式实现下面的内容:
当 type 是5的时候,把a表 BJNO,Name,Datatime 分别记录到 b表的BJNO,Name,startdatatime。
当 type 是2的时候,把a表 Datatime 记录到 先前 插入 到b 表中的记录(先前最后插入b表且bjno可以对应上的记录)中的 enddatatime 中。

结果 b 表示意

ID BJNO name startdatatime enddatatime time_difference
1 Bj0001 1号报卷 2013-1-1 2013-1-2 1
2 Bj0002 2号报卷 2013-1-3 2013-1-5 2
3 Bj0001 1号报卷 2013-1-4 当天减去 2013-1-4

游标我不是太懂,求高人指教

该回答引用ChatGPT

可以使用游标和PL/SQL语句实现这个功能。以下是一个可能的实现方法:

DECLARE
  CURSOR cur_a IS
    SELECT * FROM a ORDER BY BJNO, Name, Datatime, type;
  v_startdatatime a.datatime%TYPE;
  v_enddatatime a.datatime%TYPE;
BEGIN
  FOR rec_a IN cur_a LOOP
    IF rec_a.type = 5 THEN
      -- 新开始时间记录到b表
      INSERT INTO b (ID, BJNO, Name, startdatatime)
      VALUES (b_seq.NEXTVAL, rec_a.BJNO, rec_a.Name, rec_a.Datatime);
      v_startdatatime := rec_a.Datatime;
    ELSE
      -- 找到最近一次的开始时间并更新enddatatime
      SELECT startdatatime INTO v_startdatatime
      FROM (
        SELECT *
        FROM b
        WHERE BJNO = rec_a.BJNO AND Name = rec_a.Name AND startdatatime <= rec_a.Datatime
        ORDER BY startdatatime DESC
      )
      WHERE ROWNUM = 1;
      UPDATE b
      SET enddatatime = rec_a.Datatime, time_difference = rec_a.Datatime - v_startdatatime
      WHERE BJNO = rec_a.BJNO AND Name = rec_a.Name AND startdatatime = v_startdatatime;
    END IF;
  END LOOP;
END;

这段PL/SQL代码首先声明一个游标cur_a,按BJNO、Name、Datatime和type升序排列a表中的记录。然后,遍历游标中的每条记录,如果type是5,则在b表中插入一条新记录,如果type是2,则在b表中找到最近一次的开始时间,并将当前记录的Datatime更新为enddatatime,并计算time_difference。最后,更新b表中的记录。注意,这里使用了序列b_seq,用于为插入的b表记录生成唯一的ID。