首页 > 解决方案 > 使用 for 循环删除前 10 行

问题描述

我在一次采访中被问到,“如何使用 for 循环删除前十行”?

我回答说,“这听起来不合逻辑,因为不需要使用 for 循环来删除前十行”。我是对的吗?

如果我必须提出问题,答案会是什么?

for i in 1..10
   loop
    delete from table where rownum=1;
   end loop

标签: oraclesql-delete

解决方案


您可以使用 SQL 和ROWID伪列直接关联SELECT发生ORDERing 的DELETE语句与使用行指针的语句之间的关联(而不必关联表中的主键):

DELETE FROM table_name
WHERE  ROWID IN (
  SELECT   ROWID
  FROM     table_name
  ORDER BY value
  FETCH FIRST 10 ROWS ONLY
)

如果你想使用FOR循环,那么你可以在 PL/SQL 中通过使用BULK COLLECT来存储ROWID值来做同样的事情:

DECLARE
  TYPE rowid_t IS TABLE OF ROWID;
  rowids rowid_t;
BEGIN
  SELECT ROWID
  BULK COLLECT INTO ROWIDS
  FROM   table_name
  ORDER BY value
  FETCH FIRST 10 ROWS ONLY;
  
  FOR i IN 1 .. rowids.COUNT LOOP
    DELETE FROM table_name
    WHERE ROWID = rowids(i);
  END LOOP;
END;
/

(注意:您希望循环到集合的大小,而不是天真地循环到最大值 10,因为表中可能没有 10 行要删除。)

db<>在这里摆弄


推荐阅读