使用原因
(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;
这样能够保证按照‘执行条件’进行更新语句;