Требуется, чтобы переменная PL / SQL вводилась через конкатенацию строк; вам не хватает некоторых одинарных кавычек:
EXECUTE IMMEDIATE 'CREATE TABLE test_partition_copy
(id, datetime, ...)
PARALLEL NOLOGGING
AS SELECT id, datetime, ...
FROM test_partition PARTITION ("' || products_tab(i).partition_name || '")';
Вам также необходимо ключевое слово AS
; предложения PARALLEL NOLOGGING
идут после списка имен столбцов новой таблицы; лучше перечислить столбцы явно в обеих частях оператора; и я включил двойные кавычки вокруг имени раздела на всякий случай.
Если вы создаете свой динамический оператор c как строковую переменную, вы можете проверить это (например, через dbms_output
), чтобы посмотреть для ошибок, или даже попробуйте запустить его вручную, чтобы лучше понять, где именно происходит ошибка, в зависимости от вашего клиента. Затем вы можете сделать EXECUTE IMMEDIATE <string_variable>
.
У вас все еще есть проблема, связанная с тем, что вы пытаетесь создать таблицу с тем же именем - test_partition_copy
- каждый раз; в первый раз для l oop для первого раздела вы можете создать эту таблицу ОК, но для второго l oop для второго раздела возникнет ошибка, поскольку таблица уже существует.
Кстати, DDL фиксирует неявно, поэтому вам не нужен явный commit
.