Курсор возвращает больше данных, которые доступны в таблице - PullRequest
2 голосов
/ 10 октября 2019

У меня есть запрос

select * from ot.city_vw;

Данные поступают: enter image description here

Но когда я пишу блок pl / sql для получения данных, тогда

declare
v_data OT.city%rowtype;
CURSOR cur1  is
select * from ot.city_vw;
begin

open cur1;
loop
fetch cur1 into v_data;
dbms_output.put_line(v_data.city_id);
dbms_output.put_line(v_data.city_name);
 EXIT WHEN cur1%NOTFOUND;
    END LOOP;
    CLOSE cur1;
end;
/

последние данные таблицы появляются в два раза, как показано на рисунке ниже:

enter image description here

В чем проблема с моим курсором? почему последние данные поступают дважды?

1 Ответ

3 голосов
/ 10 октября 2019

Перемещение EXIT вверх.

open cur1;
loop
  fetch cur1 into v_data;
  EXIT WHEN cur1%NOTFOUND;                      --> here
  dbms_output.put_line(v_data.city_id);
  dbms_output.put_line(v_data.city_name);
END LOOP;
CLOSE cur1;

Или, что еще лучше, курсор пользователя FOR loop:

begin
  for v_data in (select * from ot.city_vw) 
  loop
    dbms_output.put_line(v_data.city_id);
    dbms_output.put_line(v_data.city_name);
  end loop;
end;

Разве это не выглядит проще? Oracle выполняет всю работу dirty за вас (объявление переменной курсора, открытие курсора, выход из цикла, закрытие курсора). Я предлагаю вам использовать его, когда это возможно.

...