[英]PL/SQL cannot delete multiple rows
我已經使用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;
獲取前兩行。
select * from table_name where rownum = 2;
不會獲得任何行,因為您必須先閱讀第一行,才能閱讀第二行。
這就是說,您必須更換
DELETE FROM table_name WHERE rownum = i;
與
DELETE FROM table_name WHERE rownum = 1;
但是您為什么仍要這樣做? 為什么要刪除任意選擇的記錄? 為什么要使用PL / SQL,而不是僅僅使用DELETE FROM table_name WHERE rownum <= 4;
?
您需要了解的是Oracle如何處理ROWNUM。 將ROWNUM分配給行時,Oracle從1開始,並且僅在選擇行時才遞增該值; 也就是說,當滿足WHERE子句中的所有條件時。 由於我們的條件要求ROWNUM大於2或等於第n個值,因此不會選擇任何行,並且ROWNUM永遠不會超過1。
如果您確實想使用PLSQL來實現它而不是像我的朋友Throsten所說的那樣使用SQL查詢來實現它,請在下面找到一個解決方案。
我創建了一個虛擬表test_c,其中包含1列(以數字作為其類型的ID)。
set serveroutput on ;
DECLARE
i number(2);
j number(2);
counter number(10):=0;
BEGIN
FOR i IN 5..11 LOOP
if counter = 0 then
j:=i;
end if;
DELETE FROM test_c WHERE ID = (select id from (select id,rownum as ro from test_c order by id) where ro =j);
dbms_output.put_line('i is: '|| i);
counter:=counter+1;
END LOOP;
END;
請注意,這不是正確的方法,但可以滿足您的要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.