FollowUp: Как использовать имя раздела в качестве параметра в операторе выбора? - PullRequest
0 голосов
/ 05 февраля 2020

Исходя из этого поста: Как использовать имя раздела в качестве параметра в операторе выбора? Я пытался повторить его, но безуспешно. Я получаю сообщение об ошибке «ORA-00922» Неверный или отсутствующий параметр. Это должно быть что-то небольшая проблема синтаксиса, но не уверен, где именно это. Вот мой код:

DECLARE
  TYPE PROD_TAB IS TABLE OF DBA_TAB_PARTITIONS%ROWTYPE;
  PRODUCTS_TAB PROD_TAB := PROD_TAB();
  START_TIME   NUMBER;
  END_TIME     NUMBER;
BEGIN

  SELECT *
    BULK COLLECT
    INTO products_tab
    FROM dba_tab_partitions t
   WHERE table_name = 'LST_COLL';

  FOR i in products_tab.first .. products_tab.last LOOP
    EXECUTE IMMEDIATE 'CREATE TABLE test_partition_copy
    PARALLEL NOLOGGING
    ("ID", datetime, ...)
      SELECT  *  FROM test_partition PARTITION (||products_tab(i).partition_name||)';
    COMMIT;
  END LOOP;
  COMMIT;
END;

1 Ответ

2 голосов
/ 05 февраля 2020

Требуется, чтобы переменная 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...