Сценарий выглядит следующим образом.
Я создал секционированную таблицу 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;