oracle - 在 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 内。
可能是什么问题?
谢谢
解决方案
为什么你要使用循环。
这可以使用单个UPDATE
语句来完成,并且耗时更少。
UPDATE DEVICE
SET POSITIONS = 'test'
WHERE DEVICE_ID = (
SELECT DEVICE_ID
FROM DEVICE
WHERE DEVICE_ID IS NOT NULL
AND ROWNUM < 3
)
此外,您需要检查其他会话是否尚未锁定行,或者我们可以说尚未提交/回滚正在更新/删除同一记录的事务。
干杯!!
推荐阅读
- javascript - 带有 for 循环的异步/等待 | await 仅在 async 函数中有效
- php - 从字符串或文本中查找下标或上标
- reactjs - React Router - 如何将用户路由到他们刚刚来自的页面?
- conda - 如何使用 pip、conda 和 miniconda 完全去除气流?
- javascript - 列和行的值
- php - 未找到 laravel 社交名流类 ServiceProvider
- mesos - 如何在 minidcos CLI 中安装 kubernetes 包
- jquery - jquery 验证插件无法显示关于 maxlength 的“textarea”的验证消息
- java - 编程音乐播放器 AB 重复
- elisp - 如何将列表中的成员作为字符串传递给另一个函数?