Как сделать так, чтобы индексы переименовывались повторно? - PullRequest
0 голосов
/ 20 марта 2019

Сценарий выглядит следующим образом.

Я создал секционированную таблицу A с двумя индексами.Затем вставляются записи из исходной таблицы B, которая также имеет два индекса.Таблица B содержит 133 миллиона строк.

Теперь я хотел бы переименовать старую таблицу B в '_old', включая ее индексы. Наконец, переименуйте новую секционированную таблицу обратно в исходную таблицу, включая ее индексы.

Я знаю, что могу просто написать оператор Alter для выполнения вышеуказанных задач, но идея состоит в том, чтобы сделать его re-runnable !Как я могу это сделать?

DECLARE
   PROCEDURE check_indexes
   (
      table_owner_in    IN VARCHAR2
     ,table_name_in     IN VARCHAR2
     ,index_name_in     IN VARCHAR2
     ,new_index_name_in VARCHAR2
   ) IS
      count_indexes NUMBER;
   BEGIN

      SELECT COUNT(*)
        INTO count_indexes
        FROM user_indexes
       WHERE table_owner = table_owner_in
         AND table_name = table_name_in
         AND index_name = index_name_in;

      IF count_indexes > 0
      THEN
         dbms_output.put_line('ALTER INDEX ' || index_name_in ||
                              ' RENAME TO ' || new_index_name_in);
      END IF;
   END;
BEGIN
   check_indexes(table_owner_in    => 'UTILS_OWNER'
                ,table_name_in     => 'OP_LOG_OLD'
                ,index_name_in     => 'OL_MODULE_NAME_I'
                ,new_index_name_in => 'OL_MODULE_NAME_I_OLD');

   check_indexes(table_owner_in    => 'UTILS_OWNER'
                ,table_name_in     => 'OP_LOG_OLD'
                ,index_name_in     => 'OL_PK'
                ,new_index_name_in => 'OL_PK_OLD');

   check_indexes(table_owner_in    => 'UTILS_OWNER'
                ,table_name_in     => 'OP_LOG'
                ,index_name_in     => 'OL_MODULE_NAME_I_NEW'
                ,new_index_name_in => 'OL_MODULE_NAME_I');

   check_indexes(table_owner_in    => 'UTILS_OWNER'
                ,table_name_in     => 'OP_LOG'
                ,index_name_in     => 'OL_PK_NEW'
                ,new_index_name_in => 'OL_PK');
END;
...