oracle - 使用 for 循环删除前 10 行
问题描述
我在一次采访中被问到,“如何使用 for 循环删除前十行”?
我回答说,“这听起来不合逻辑,因为不需要使用 for 循环来删除前十行”。我是对的吗?
如果我必须提出问题,答案会是什么?
for i in 1..10
loop
delete from table where rownum=1;
end loop
解决方案
您可以使用 SQL 和ROWID
伪列直接关联SELECT
发生ORDER
ing 的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<>在这里摆弄
推荐阅读
- python - 参加编程课程,但不知道如何按照这个问题的思路将 try 和 except 合并到代码中
- reactjs - 我如何使用酶开玩笑地“拦截”请求?
- matrix - 在Julia中制作n维对角张量
- design-patterns - 带有泛型的 Kotlin 责任链模式
- php - 使用数组中的序列化 PHP 关联数组
- javascript - 放大和缩小 d3 地图
- python - Python multiprocessing.Pool 和参数酸洗
- python-3.x - Python 3.7 - Pygame 1.9.4
- codesniffer - PHP CodeSniffer 是否支持 Rubcop 等特定于规则的配置?
- javascript - 在Javascript中为特定对象键赋值