Удалите самый старый раздел автоматически в Oracle 11G - PullRequest
4 голосов
/ 04 апреля 2011

У меня есть требование удалить раздел из таблицы с интервалами, если раздел старше трех месяцев.

Существует ли утилита / функция oracle для этого? Или, если нет, как это реализовать? Пожалуйста, ведите меня.

Database version: Oracle 11G

Ответы [ 3 ]

3 голосов
/ 05 апреля 2011

Это непонятно и не элегантно, но оно работает для приведения выражения VALUES LESS THAN some_date в DBA_TAB_PARTITIONS, по крайней мере, для секционирования по диапазонам, включая интервальное, в 10g и 11g. Вдохновленный вопрос Тома Кайта "Evaluate Expression" . Ваш пробег может отличаться.

declare
  l_hival     varchar2(4000);
  l_sql       varchar2(4000);
  l_high_date date;
  l_cursor    integer default dbms_sql.open_cursor;
  l_rows_back number;
begin
  -- partition position = 1 always grabs the "oldest" partition
  select high_value
    into l_hival
    from dba_tab_partitions
   where table_name = <my_range_partitioned_table>
     and partition_position = 1;

  dbms_sql.parse (l_cursor, 
                  'begin :retval := ' || l_hival || '; end;',
                  dbms_sql.native);

  dbms_sql.bind_variable (l_cursor, ':retval', l_high_date);
  l_rows_back := dbms_sql.execute (l_cursor);
  dbms_sql.variable_value (l_cursor, ':retval', l_high_date);
  dbms_output.put_line (to_char(l_high_date, 'yyyy-mm-dd-hh24.mi.ss'));
end;
/

Поскольку это PL / SQL, он может быть инкапсулирован в функцию, возвращающую «высокое значение» для любой секционированной таблицы, переданной в качестве аргументов.

3 голосов
/ 04 апреля 2011

Я не знаю ни одной утилиты или функции оракула для этого.Вы можете найти информацию, необходимую для написания собственной программы, для этого в представлениях DBA_TAB_PARTITIONS или ALL_TAB_PARTITIONS, аналогично следующему:

SELECT TABLE_OWNER, TABLE_NAME, PARTITION_NAME, HIGH_VALUE
  FROM SYS.DBA_TAB_PARTITIONS
  WHERE TABLE_OWNER = strSchema AND
        TABLE_NAME = strTable

, где strSchema и strTable - это интересующая вас схема и таблица. HIGH_VALUE - это поле LONG, которое содержит код для вызова функции TO_DATE (при условии, что ваша таблица разбита на поле даты);вам нужно присвоить HIGH_VALUE для поля LONG, затем назначить LONG для VARCHAR2, чтобы получить значение, которым можно манипулировать, таким образом, как:

lHigh_value     LONG;
strDate_clause  VARCHAR2(100);

lHigh_value := aRow.HIGH_VALUE;
strDate_clause := lHigh_value;

Тогда вам просто нужноизвлечь соответствующие поля из предложения DATE, чтобы определить, какие разделы вам нужно удалить.

Делитесь и наслаждайтесь.

0 голосов
/ 05 апреля 2011

Мне тоже интересно, есть ли автоматическое решение в 11g.
В старых версиях я использую один из двух подходов:

  1. Придерживаясь строгого имени стандарта для разделаимена, например SALE201101, SALE201102 (за январь и февраль 2011 года), позволяют извлекать соответствующие данные из ALL_TAB_PARTITIONS, а затем вы можете удалить любой раздел, самый старый.

  2. Соси его и используй крошечную таблицу метаданных с одним столбцом для partition_name и одним правильно введенным столбцом для периода времени (будь то дата, неделя, месяц, раз в два месяца, год, розничные недели)).Затем я выбираю самый старый период времени и удаляю связанный раздел.

Это не «полная автоматизация», но упрощает автоматизацию.

...