2011-04-04 60 views
3

如果分區大於三個月,我有要求從分區間隔表中刪除分區。在oracle中自動刪除最老的分區11G

有沒有一個oracle實用程序/功能來做到這一點?或者,如果沒有,如何實現這一點?請指導我。

Database version: Oracle 11G 
+0

沒有提供自動分區清除實用程序。你需要寫一個。 – 2015-11-20 13:07:18

回答

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到VARCHAR2爲了得到價值的地方就可以被操縱,以類似的方式:

lHigh_value  LONG; 
strDate_clause VARCHAR2(100); 

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

然後你只需要提取DATE子句中的相應字段,以確定您需要刪除哪些分區。

分享和享受。

0

如果11g中有自動解決方案,我也感興趣。
在舊版本中,我使用以下兩種方法之一:

  1. 堅持的分區名稱嚴格的名標,例如SALE201101SALE201102(一月份和2011年2月),允許你提取相關數據ALL_TAB_PARTITIONS然後你可以放下任何最老的分區。

  2. 搞砸了,在一段時間內(無論是日期,周,月,雙月,年度,零售周)使用一個帶有一列的微小元數據表作爲分區名稱和一個正確類型的列。然後,我選擇最早的時間段並刪除關聯的分區。

這不是「全自動」,但它使自動化更容易。

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,它可以被封裝成函數來作爲參數傳入任何分區表返回「高價值」。