Почему коллекция не заполняется открытым курсором BULK COLLECT .. LIMIT - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь заполнить коллекцию массовым сбором .. предложение limit. Код работает, если я использую обычный BULK COLLECT без ограничений. Но с BULK COLLECT .. LIMIT l oop коллекция не заполняется. Также я не понимаю, почему collectionname.COUNT = 0, когда больше нет значений для извлечения.

Код указан ниже:

DECLARE
   c_limit PLS_INTEGER := 5;

   CURSOR employees_cur
   IS
      SELECT employee_id
        FROM employees;

   TYPE employee_ids_t IS TABLE OF 
      employees.employee_id%TYPE;

   l_employee_ids   employee_ids_t;
BEGIN
   OPEN employees_cur;

   LOOP
      FETCH employees_cur
      BULK COLLECT INTO l_employee_ids
      LIMIT c_limit;

   dbms_output.put_line ('after bulk collect count '||l_employee_ids.COUNT);
   dbms_output.put_line ('after bulk collect first '||l_employee_ids.FIRST);
   dbms_output.put_line ('after bulk collect last '||l_employee_ids.LAST);

      EXIT WHEN l_employee_ids.COUNT = 0;

   END LOOP;

   CLOSE employees_cur;

    dbms_output.put_line ('Outside loop: ');
   dbms_output.put_line ('after bulk collect count '||l_employee_ids.COUNT);
   dbms_output.put_line ('after bulk collect first '||l_employee_ids.FIRST);
   dbms_output.put_line ('after bulk collect last '||l_employee_ids.LAST);
EXCEPTION
 WHEN OTHERS THEN
   dbms_output.put_line ('Error: '||SQLERRM);
END;

Нет исключений. За пределами l oop collection.COUNT показывает 0, а FIRST и LAST - NULL. Я не понимаю, что пошло не так. Код почти дословный (за исключением put_lines) из примера Oracle в блоге. https://blogs.oracle.com/oraclemagazine/bulk-processing-with-bulk-collect-and-forall

(листинг 6: выборка до указанного числа строк)

Я нахожусь на 12,1 Oracle

Внутри l oop для каждой итерации, COUNT = LIMIT value, и FIRST равен 1, а LAST = COUNT являются напечатанными значениями.

1 Ответ

1 голос
/ 18 апреля 2020

Вы ожидаете, что данные будут добавлены в коллекцию во время каждого l oop. Например, после второго l oop вы хотите, чтобы данные в коллекции были равны 10. Но лимит не работает так, как у вас использовать коллекцию внутри самого l oop, потому что на каждой итерации коллекция почти состоит из 5 элементов, что является ПРЕДЕЛОМ коллекции

...