簡體   English   中英

PL / SQL無法刪除多行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM