Создание и удаление таблиц в хранимых процедурах - почти всегда неправильное решение.
Сначала вы только что превратили запрос в изменение базы данных;это проблематично по ряду причин, но особенно при повышении привилегий.Во-вторых, DDL может потерпеть неудачу по разным причинам, поэтому такой подход создает опасность, которой нет в чистом запросе.В-третьих, создание, заполнение и удаление таблицы увеличивает накладные расходы.
Лучшее решение: просто напишите эффективный оператор SELECT.
Альтернативные решения в порядке убывания производительности:
- использование предложений WITH для управления потоком запросов
- заполнение коллекций PL / SQL
- в 18c частных временных таблицах
- глобальных временных таблиц.
Ваш вопрос представляет собой сценарий запроса исходного набора результатов с последующим программным управлением им.Моя первая мысль: вы должны попытаться сделать это на чистом SQL.Oracle обладает обширным арсеналом функций, не в последнюю очередь аналитических функций, и вы будете удивлены тем, как много можно сделать в запросе.Но если вам действительно нужно работать процедурно, заполнение массивов и манипулирование ими - следующий наиболее эффективный подход.Заполнение глобальной временной таблицы стоит дорого, потому что это влечет за собой запись на диск и чтение с диска.Рассматривайте GTT только в том случае, если вы ограничены памятью сеанса или вам необходимо обмениваться данными между несколькими процедурами.