Oracle PL/SQL无法删除多行

Oracle PL/SQL无法删除多行,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我已经编写了使用PL/SQL从一个表中删除多行的简单代码,但下面的代码每触发一行就只删除一行 DECLARE i number(2); BEGIN FOR i IN 1..4 LOOP DELETE FROM table_name WHERE rownum = i; dbms_output.put_line('i is: '|| i); END LOOP; END; 有人能告诉我代码有什么问题吗?ROWNUM是读取的第n行 select

我已经编写了使用PL/SQL从一个表中删除多行的简单代码,但下面的代码每触发一行就只删除一行

DECLARE
    i number(2);
BEGIN
    FOR i IN 1..4 LOOP
        DELETE FROM table_name WHERE rownum = i;
        dbms_output.put_line('i is: '|| i);
    END LOOP;
END;

有人能告诉我代码有什么问题吗?

ROWNUM
是读取的第n行

select * from table_name where rownum = 1;
让你坐在第一排

select * from table_name where rownum <= 2;
不获取任何行,因为如果未读取第一行,则无法读取第二行

这就是说,你必须更换

DELETE FROM table_name WHERE rownum = i;


但你为什么要这么做?为什么要删除任意挑选的记录?为什么要使用PL/SQL,而不仅仅是从表名中删除,其中rownum
rownum
是读取的第n行

select * from table_name where rownum = 1;
让你坐在第一排

select * from table_name where rownum <= 2;
不获取任何行,因为如果未读取第一行,则无法读取第二行

这就是说,你必须更换

DELETE FROM table_name WHERE rownum = i;


但你为什么要这么做?为什么要删除任意挑选的记录?为什么要使用PL/SQL,而不仅仅是从rownum所在的表名中删除,您需要了解Oracle是如何处理rownum的。将ROWNUM分配给行时,Oracle从1开始,仅在选择行时增加值;也就是说,当满足WHERE子句中的所有条件时。因为我们的条件要求ROWNUM大于2或等于第n个值,所以不会选择任何行,并且ROWNUM的增量永远不会超过1

如果你真的想像我的朋友Throsten所说的那样使用PLSQL和SQL查询来实现它,那么请在下面找到一个解决方法

我创建了一个虚拟表test_c,其中包含1列(ID,其类型为number)


请注意,这不是正确的方法,但可以满足您的要求。

您需要了解的是Oracle如何处理ROWNUM。将ROWNUM分配给行时,Oracle从1开始,仅在选择行时增加值;也就是说,当满足WHERE子句中的所有条件时。因为我们的条件要求ROWNUM大于2或等于第n个值,所以不会选择任何行,并且ROWNUM的增量永远不会超过1

如果你真的想像我的朋友Throsten所说的那样使用PLSQL和SQL查询来实现它,那么请在下面找到一个解决方法

我创建了一个虚拟表test_c,其中包含1列(ID,其类型为number)


<强>请注意,这不是正确的方式,但会为您的要求工作。

查看,也考虑使用FALLL语句,删除循环中的行是非常低效的,请考虑使用FALLL语句,为回滚中的行删除行是非常低效的。这几行是PLSQL过程的一部分,代码的目的是使用PLSQLYes删除多行,但通常只使用SQL(
delete from table_name where…
)删除多行。为什么要使用PL/SQL(一种编程语言)来实现这一点?为什么要删除随机行?您不想删除特定的行吗?谢谢回复。。这几行是PLSQL过程的一部分,代码的目的是使用PLSQLYes删除多行,但通常只使用SQL(
delete from table_name where…
)删除多行。为什么要使用PL/SQL(一种编程语言)来实现这一点?为什么要删除随机行?是否要删除特定行?