如果分区超过三个月,我需要从间隔分区表中删除分区。
是否有oracle实用程序/函数来执行此操作?或者如果没有,如何实现这个?请指导我。
Database version: Oracle 11G
答案 0 :(得分:3)
我不知道有任何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是一个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子句中提取相应的字段,以确定需要删除的分区。
分享并享受。
答案 1 :(得分:3)
这是不稳定且不优雅的,但它确实适用于在DBA_TAB_PARTITIONS中转换VALUES LESS THAN some_date
表达式,至少对于范围分区,包括间隔分区,在10g和11g中。灵感来自Tom Kyte's "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,它可以封装到一个函数中,以返回作为参数传入的任何分区表的“高值”。
答案 2 :(得分:0)
如果11g中有自动解决方案,我也很感兴趣。
在旧版本中,我使用以下两种方法之一:
坚持使用严格的分区名称标准,例如SALE201101
,SALE201102
(2011年1月和2011年2月),可以从ALL_TAB_PARTITIONS
中提取相关数据然后你可以删除最旧的分区。
将其吸取并使用一个小的元数据表,其中一列为partition_name,另一列为正确类型的列(无论是日期,星期,月份,双月,年度,零售周)。然后我选择最早的时间段并删除相关的分区。
这不是“完全自动化”,但它使自动化变得更容易。