wen676395159 2013-09-27 03:39 采纳率: 0%
浏览 7778

关于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

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

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-20 19:52
    关注

    该回答引用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。

    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?