【发布时间】:2018-06-26 06:56:36
【问题描述】:
下面的查询会批量选择,然后循环更新记录。我想在这里使用 BULK COLLECT INTO 和 FORALL 构造来提高性能。但是查询使用 rownum 来更新循环中的列。无论如何我可以在获取 rownum 的同时使用 BULK COLLECT INTO 吗?
FOR rec IN
(SELECT rownum rn,
b.*
FROM
(SELECT *
FROM temp_final a
WHERE reid = 1
AND retype = 9
AND sid = 'r123'
AND pid = 2191
ORDER BY a.horder DESC nulls last,
sname ,
rowgroup ,
dpct DESC nulls last ,
name
) b
)
LOOP
UPDATE temp_final
SET horder=rec.rn
WHERE reid = 1
AND retype = 9
AND sid = 'r123'
AND pid = 2191
AND mid =rec.mid;
END LOOP;
谢谢
【问题讨论】:
-
您绝对不应该使用 rownum 进行更新 :) 使用您的主键或其他唯一键
-
感谢 Sudipta 的回复。在 SQL 选择查询中,我将结果按某种顺序排列,我需要在其中一个列中更新该顺序。我认为我不能从主要实现相同的事情或其他键。 :)
-
如果你想要一个订单,使用排名功能。我建议您重新考虑使用rownum。你应该在 ASK TOM 或其他 Stackoverflow 问题上阅读它
-
是的,您可以使用
rownum或您想要的任何其他内容。什么不工作? -
您已就康纳的回答向我发表了评论。只是为了回答您的问题,是的,即使我们订购表记录/行,
ROWID也会相同。 rowid 唯一标识每一行的地址,并且不是在运行时生成的,如ROWNUM。 google rowid 让 Oracle 了解更多。
标签: sql oracle rownum forall bulk-collect