4

パーティションが 3 か月以上経過している場合、間隔パーティション テーブルからパーティションを削除する必要があります。

これを行うためのOracleユーティリティ/関数はありますか? そうでない場合、これを実装する方法は?私を案内してください。

Database version: Oracle 11G
4

3 に答える 3

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は、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句から適切なフィールドを抽出する必要があります。

共有してお楽しみください。

于 2011-04-04T12:50:58.477 に答える
3

これはおかしくて洗練されていませんが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 であるため、関数にカプセル化して、引数として渡されたパーティション化されたテーブルの「高い値」を返すことができます。

于 2011-04-05T13:56:16.197 に答える
0

11gに自動解決策があるかどうか、私も興味があります。
古いバージョンでは、次の 2 つの方法のいずれかを使用します。

  1. たとえばSALE201101SALE201102(2011 年 1 月と 2 月の場合)のように、パーティション名の厳密な名前基準に固執することでALL_TAB_PARTITIONS、そこから関連データを抽出し、最も古いパーティションを削除できます。

  2. 思い切って、partition_name 用の 1 つの列と、期間 (日付、週、月、隔月、毎年、小売週のいずれか) 用に正しく型指定された 1 つの列を含む小さなメタデータ テーブルを使用します。次に、最も古い期間を選択し、関連するパーティションを削除します。

これは「完全自動化」ではありませんが、自動化が容易になります。

于 2011-04-04T21:35:52.573 に答える