Как удалить разделы из таблиц в нескольких схемах? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь написать процедуру, которая по существу удаляет разделы из нескольких таблиц, которые хранятся в нескольких схемах.Конечная цель - создать планировщик dbms, который будет выполнять эту процедуру каждый день и проверять разделы, содержащие данные старше 6 месяцев.Как добавить функциональность поиска разделов в нескольких схемах?

Я создал процедуру, которая удаляет раздел только из определенной таблицы.

PROCEDURE purge_ops_log_range_parts IS
   BEGIN
      FOR partition_rec IN (SELECT partition_name
                                  ,high_value
                              FROM user_tab_partitions
                             WHERE table_name =
                                   'OPSWIRE_LOG_RANGE_PARTS')
      LOOP
         IF SYSDATE >= add_months(to_date(substr(partition_rec.high_value
                                                ,12
                                                ,19)
                                         ,'YYYY-MM-DD HH24:MI:SS')
                                 ,6)
         THEN
            execute_immediate('ALTER TABLE OPS_LOG_RANGE_PARTS DROP PARTITION ' ||
                              partition_rec.partition_name);
         END IF;
      END LOOP;
   END purge_ops_log_range_parts;

Вывод удаляет раздел только из определенной таблицы, но не ищет несколько таблиц в различных схемах.

1 Ответ

0 голосов
/ 27 декабря 2018

Используйте DBA_TAB_PARTITIONS или ALL_TAB_PARTITIONS представления вместо USER_TAB_PARTITIONS.Первые два представления содержат столбец TABLE_OWNER (т.е. схема), который должен помочь вам в достижении вашей цели.

Затем вы можете параметризовать вашу процедуру, чтобы взять имена владельцев и таблиц в качестве параметров:

PROCEDURE purge_ops_log_range_parts(pinOwner      IN VARCHAR2,
                                    pinTable_name IN VARCHAR2)
IS
BEGIN
  FOR partition_rec IN (SELECT partition_name
                              ,high_value
                          FROM DBA_TAB_PARTITIONS
                         WHERE TABLE_OWNER = pinOwner AND
                               table_name = pinTable_name)
  LOOP
     IF SYSDATE >= add_months(to_date(substr(partition_rec.high_value
                                            ,12
                                            ,19)
                                     ,'YYYY-MM-DD HH24:MI:SS')
                             ,6)
     THEN
        execute_immediate('ALTER TABLE ' || pinOwner || '.' ||
                             pinTable_name || ' DROP PARTITION ' ||
                             partition_rec.partition_name);
     END IF;
  END LOOP;
END purge_ops_log_range_parts;

Удачи.

...