使用游标进行更新数据

使用原因    

(1)大批量执行修改操作;

(2)执行条件具有一定规律,需要进行计算得出,而非固定值;

面对这种情况如果直接使用update进行更新操作,有时候会出现‘执行条件’被无视的情况;

举例说明:

根据巡视记录批量更新巡视时间;

直接使用update进行更新:

UPDATE checkroutetaskinfotable a
SET lastpatraltime =(SELECT lastpatraltime
                                  FROM(SELECT circuitryname,poleid,MAX(patraldate) AS lastpatraltime
                                             FROM patrolpoletable
                                             WHERE circuitryname NOT LIKE '%备份%'
                                             group by circuitryname, poleid

                                             )b

                                  WHERE a.circuitryname=b.circuitryname AND a.poleid =b.polei

                                 );

数据库在执行上述语句有时会忽略where后面的执行条件,导致更新时间超长;

使用游标更新

create or replace
PROCEDURE UP_LASTPATRALTIME
AS
BEGIN
  DECLARE
    CURSOR stus_cur
    IS
      SELECT circuitryname,poleid,MAX(patraldate) AS lastpatraltime
      FROM patrolpoletable
      WHERE circuitryname NOT LIKE '%备份%'
      AND TO_CHAR(patraldate,'yyyy-mm-dd')>='2018-04-01'
      GROUP BY circuitryname,poleid;
    --定义rowtype
    cur_stu stus_cur%rowtype;
    /*开始执行*/
  BEGIN
    --开启游标
    OPEN stus_cur;
    --loop循环
    LOOP
      --循环条件
      EXIT
    WHEN stus_cur%notfound;
      --游标值赋值到rowtype
      FETCH stus_cur INTO cur_stu;
      DBMS_OUTPUT.put_line(cur_stu.circuitryname);
      DBMS_OUTPUT.put_line(cur_stu.poleid);
      DBMS_OUTPUT.put_line(cur_stu.lastpatraltime);
      --更新巡视时间
      UPDATE checkroutetaskinfotable a
      SET a.lastpatraltime = cur_stu.lastpatraltime
      WHERE a.circuitryname NOT LIKE '%备份%'
      AND a.circuitryname=cur_stu.circuitryname
      AND a.poleid       =cur_stu.poleid;
    END LOOP;
    CLOSE stus_cur;
  END;

END UP_LASTPATRALTIME;

这样能够保证按照‘执行条件’进行更新语句;

猜你喜欢

转载自blog.csdn.net/sxb0103/article/details/80652485