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。

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。