如何使重命名索引可重新运行?

时间:2019-03-20 15:19:02

标签: oracle plsql partitioning

这种情况是这样的。

我创建了具有两个索引的分区表A。然后从原始表B中插入记录,该表也有两个索引。表B有1.33亿行。

现在,我想将旧表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;

0 个答案:

没有答案