На мой взгляд, вся концепция неверна.В Oracle вы не создаете таблицы динамически, действительно, действительно редкие ситуации, которые оправдывают это.Ваш код полностью статический , нет ничего, что требует динамического SQL.
Рассмотрите возможность создания таблицы один раз - и используйте ее по мере необходимости.Это может включать удаление строк из него.
CTAS с условием false создаст пустую таблицу:
create table new_clients as select * from client_names where 1 = 2;
Вставляйте в нее данные ежемесячно (какэто то, что предлагает ваш код):
insert into new_clients
select *
from client_names
where custid in (select id
from customers
where joining_date between trunc(sysdate, 'mm')
and trunc(last_day(sysdate))
);
Я полагаю, что JOINING_DATE на самом деле не YYYY-MM, а дата true .Если на нем есть индекс, он все равно будет работать из-за предложения BETWEEN, которое извлекает весь текущий месяц (хотя, возможно, потребуется дополнительная настройка, в зависимости от имеющихся у вас данных).
Кроме того, это будетлучше, если вы указали имена столбцов, участвующих в операторе INSERT (не имеет значения, их много - назовите их по одному).select *
работает нормально, пока что-то не изменится, а затем не будет работать.
При необходимости такой insert
можно легко перенести в процедуру.Кстати, для чего: для чего используется параметр IN?Вы объявили это, но оно никогда не использовалось.