首页 > 解决方案 > 在 oracle 上更新 for 循环需要很长时间

问题描述

我得到了这个过程来设置多个值的更新,但是在我的测试中,它需要很多时间并停留在运行过程中。我尝试将 ROWNUM < 3 设置为仅使用 2 ID 进行测试,但仍然相同..

    BEGIN 

   FOR device_update
      IN (SELECT device_id
            FROM device where  device_id is not null and ROWNUM < 3 )
   LOOP
      UPDATE device 
         SET positions = (SELECT max(position) from position where device = device_update.device_id)
       WHERE device_id = device_update.device_id;
       commit;
       dbms('done device id :');
       dbms(device_update.device_id);
   END LOOP;

END;

更新不起作用并停留在 ScriptRunner (sql developer) 上,但是当我删除更新语句时,我只保留 DBMS 这个工作在 1ms 内。

可能是什么问题?

谢谢

标签: oracleloops

解决方案


为什么你要使用循环。

这可以使用单个UPDATE语句来完成,并且耗时更少。

UPDATE DEVICE
   SET POSITIONS = 'test'
 WHERE DEVICE_ID = (
        SELECT DEVICE_ID
          FROM DEVICE
         WHERE DEVICE_ID IS NOT NULL
           AND ROWNUM < 3
    )

此外,您需要检查其他会话是否尚未锁定行,或者我们可以说尚未提交/回滚正在更新/删除同一记录的事务。

干杯!!


推荐阅读