#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 Да, я хотел бы запустить этот скрипт несколько раз. Пожалуйста, взгляните на мой обновленный вопрос выше и дайте мне знать, правильно ли я это делаю?