在oracle 11G中自动删除最旧的分区

在oracle 11G中自动删除最旧的分区,oracle,oracle11g,database-partitioning,Oracle,Oracle11g,Database Partitioning,我需要从间隔分区表中删除分区,如果分区的时间超过三个月 是否有oracle实用程序/功能来执行此操作?若否,如何落实??请引导我 Database version: Oracle 11G 我不知道有任何oracle实用程序或函数可以做到这一点。您可以在DBA_TAB_PARTITIONS或ALL_TAB_PARTITIONS视图中找到编写自己的程序所需的信息,如下所示: SELECT TABLE_OWNER, TABLE_NAME, PARTITION_NAME, HIGH_VALUE F

我需要从间隔分区表中删除分区,如果分区的时间超过三个月

是否有oracle实用程序/功能来执行此操作?若否,如何落实??请引导我

Database version: Oracle 11G

我不知道有任何oracle实用程序或函数可以做到这一点。您可以在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是一个长字段,其中包含调用to_DATE函数的代码,假设您的表是按日期字段分区的;您需要将高_值指定给LONG字段,然后将LONG值指定给VARCHAR2,以便在可以操作它的地方获得值,方式类似于:

lHigh_value     LONG;
strDate_clause  VARCHAR2(100);

lHigh_value := aRow.HIGH_VALUE;
strDate_clause := lHigh_value;
然后,您只需要从DATE子句中提取适当的字段,以确定需要删除哪些分区


分享和享受。

如果11g中有自动解决方案,我也很感兴趣。 在旧版本中,我使用两种方法之一:

坚持分区名称的严格名称标准,例如2011年1月和2月的SALE201101、SALE201102,使您能够从所有_TAB_分区中提取相关数据,然后可以删除任何最旧的分区

吸收它并使用一个很小的元数据表,其中一列表示分区名称,另一列表示时间段(无论是日期、周、月、双月、年、零售周)。然后我选择最早的时间段并删除关联的分区


这不是完全自动的,但它使自动化更容易。

这是不可靠和不雅观的,但它确实适用于在DBA\u TAB\u分区中铸造小于某些日期表达式的值,至少适用于10g和11g中的范围分区,包括间隔分区。受到问题的启发。您的里程可能会有所不同

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,因此可以将其封装到函数中,以返回作为参数传入的任何分区表的高值。

没有提供自动分区清除实用程序。你需要写一个。