Sobes.tech
Назад к вопросам
Middle
5

Ты упоминал bulk-операции. Расскажи подробнее про связку BULK COLLECT и FORALL.

Компании, где спрашивали
AltDev

Ответ от нейросети

sobes.tech AI

BULK COLLECT и FORALL — это конструкции PL/SQL, которые используются для эффективной обработки больших объёмов данных, минимизируя количество переключений между SQL и PL/SQL.

  • BULK COLLECT позволяет загружать множество строк из SQL-запроса сразу в коллекцию PL/SQL (например, в массив), вместо поочерёдного перебора.

  • FORALL используется для массового выполнения DML-операций (INSERT, UPDATE, DELETE) с использованием коллекций, что значительно ускоряет выполнение по сравнению с циклом, выполняющим отдельные операции.

Пример использования связки:

DECLARE
  TYPE t_ids IS TABLE OF employees.employee_id%TYPE;
  TYPE t_salaries IS TABLE OF employees.salary%TYPE;

  l_ids t_ids;
  l_salaries t_salaries;
BEGIN
  -- Загружаем данные BULK COLLECT
  SELECT employee_id, salary
  BULK COLLECT INTO l_ids, l_salaries
  FROM employees
  WHERE department_id = 10;

  -- Обновляем зарплаты с помощью FORALL
  FORALL i IN l_ids.FIRST .. l_ids.LAST
    UPDATE employees
    SET salary = l_salaries(i) * 1.1
    WHERE employee_id = l_ids(i);

  COMMIT;
END;

Такой подход позволяет:

  • Сократить количество переключений между SQL и PL/SQL.
  • Существенно повысить производительность при обработке больших наборов данных.

Важно учитывать размер коллекций и использовать параметры LIMIT для управления объемом данных за одну операцию, чтобы избежать переполнения памяти.