PL / SQL не может удалить несколько строк - PullRequest
0 голосов
/ 28 мая 2018

Я написал простой код, используя 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;

Может кто-нибудь подсказать, что не так с кодом

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вам нужно понять, как Oracle обрабатывает ROWNUM.При назначении ROWNUM строке, Oracle начинает с 1 и увеличивает значение только тогда, когда выбрана строка;то есть, когда все условия в предложении WHERE выполнены.Поскольку наше условие требует, чтобы ROWNUM было больше 2 или равно n-му значению, строки не выбираются, и ROWNUM никогда не увеличивается на единицу больше 1.

Если вы действительно хотите достичь этого с помощью PLSQL-анота, используя запрос 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;

Обратите внимание, что это не правильный способ сделать это, но он будет работать по вашему требованию.

0 голосов
/ 28 мая 2018

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;?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...