Как сделать переименованные индексы перезапускаемыми?

#oracle #plsql #partitioning

#Oracle #plsql #разделение

Вопрос:

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

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

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

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

 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;
  

Комментарии:

1. Если вы хотите разбить таблицу на разделы в режиме онлайн, вам следует обратиться к DBMS_REDEFINITION: oracle-base.com/articles/11g /…

2. Что вы понимаете под возможностью повторного запуска ? Вы не можете дважды переименовать A в B … Если вы используете 12.2, проверьте преобразование несекционированной таблицы в секционированную , вам не нужно здесь ничего переименовывать,,,

3. @MarmiteBomber я на 12.1, поэтому не могу выполнить преобразование. Я просто хочу, чтобы мои инструкции alter по переименованию индексов были повторно запущены для исходной таблицы.

4. Вы все еще не сказали, что вы на самом деле подразумеваете под «перезапускаемыми». Почему вы хотите сделать это более одного раза? Или вы хотите, чтобы его можно было перезапустить после ошибки? Или что-то еще?

5. @AlexPoole Да, я хотел бы запустить этот скрипт несколько раз. Пожалуйста, взгляните на мой обновленный вопрос выше и дайте мне знать, правильно ли я это делаю?