パーティションが 3 か月以上経過している場合、間隔パーティション テーブルからパーティションを削除する必要があります。
これを行うためのOracleユーティリティ/関数はありますか? そうでない場合、これを実装する方法は?私を案内してください。
Database version: Oracle 11G
パーティションが 3 か月以上経過している場合、間隔パーティション テーブルからパーティションを削除する必要があります。
これを行うための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フィールドです(テーブルが日付フィールドでパーティション化されていると想定)。次のような方法で操作できる場所に値を取得するには、HIGH_VALUEをLONGフィールドに割り当ててから、LONGをVARCHAR2に割り当てる必要があります。
lHigh_value LONG;
strDate_clause VARCHAR2(100);
lHigh_value := aRow.HIGH_VALUE;
strDate_clause := lHigh_value;
次に、削除する必要のあるパーティションを決定するために、DATE句から適切なフィールドを抽出する必要があります。
共有してお楽しみください。
これはおかしくて洗練されていませんがVALUES LESS THAN some_date
、DBA_TAB_PARTITIONS で式をキャストする場合、少なくとも 10g と 11g の間隔パーティション化を含む範囲パーティション化では機能します。Tom Kyte の「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 であるため、関数にカプセル化して、引数として渡されたパーティション化されたテーブルの「高い値」を返すことができます。
11gに自動解決策があるかどうか、私も興味があります。
古いバージョンでは、次の 2 つの方法のいずれかを使用します。
たとえばSALE201101
、SALE201102
(2011 年 1 月と 2 月の場合)のように、パーティション名の厳密な名前基準に固執することでALL_TAB_PARTITIONS
、そこから関連データを抽出し、最も古いパーティションを削除できます。
思い切って、partition_name 用の 1 つの列と、期間 (日付、週、月、隔月、毎年、小売週のいずれか) 用に正しく型指定された 1 つの列を含む小さなメタデータ テーブルを使用します。次に、最も古い期間を選択し、関連するパーティションを削除します。
これは「完全自動化」ではありませんが、自動化が容易になります。