sql >> Databasteknik >  >> RDS >> Oracle

Släpp partitioner äldre än 2 månader

Först vill jag påpeka att partitionering är ett avancerat ämne i Oracle, därför kanske du vill köra all DDL manuellt i början, tills du är tillräckligt säker på att köra DDL-skript. Jag skulle också råda dig att aldrig köra ett skript som finns på internet utan att ha både förståelse det och testning det grundligt, särskilt DDL-skript.

Nu när det gäller frågan kan du fråga *_TAB_PARTITIONS ordboksvy för att hämta partitionsgränsen:

SQL> SELECT partition_name, high_value
  2    FROM user_tab_partitions
  3   WHERE table_name = 'TEST_TABLE';

PARTITION_NAME  HIGH_VALUE
--------------- --------------------------------------------------------
PT01122012      TO_DATE(' 2012-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'
PT01022013      TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'
PT01042013      TO_DATE(' 2013-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'
PT01062013      TO_DATE(' 2013-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'
PT01082013      TO_DATE(' 2013-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'

Den här kolumnen är av typen LONG (=utfasad LOB) så vi har få verktyg att filtrera med SQL, vi måste använda PL/SQL.

SQL> BEGIN
  2     FOR cc IN (SELECT partition_name, high_value --
  3                  FROM user_tab_partitions
  4                 WHERE table_name = 'TEST_TABLE') LOOP
  5        EXECUTE IMMEDIATE
  6           'BEGIN
  7               IF sysdate >= ADD_MONTHS(' || cc.high_value || ', 2) THEN
  8                  EXECUTE IMMEDIATE
  9                     ''ALTER TABLE TEST_TABLE DROP PARTITION '
 10                     || cc.partition_name || '
 11                     '';
 12               END IF;
 13            END;';
 14     END LOOP;
 15  END;
 16  /

PL/SQL procedure successfully completed

SQL> SELECT partition_name, high_value
  2    FROM user_tab_partitions
  3   WHERE table_name = 'TEST_TABLE';

PARTITION_NAME  HIGH_VALUE
--------------- -----------------------------------------------------------
PT01022013      TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 
PT01042013      TO_DATE(' 2013-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 
PT01062013      TO_DATE(' 2013-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 
PT01082013      TO_DATE(' 2013-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 



  1. SQL-utmaning/pussel:Givet ett stackspår - Hur hittar man det översta elementet vid varje tidpunkt?

  2. MySQL undantagshanterarens åtkomstundantag hanteras

  3. skriva tabeller till Postgresql med rPostgreSQL när databasnamnet består av versaler

  4. Hämta antal rader och data för den raden i en enda fråga med PDO i PHP