首先,我想指出分区是 Oracle 中的高级主题,因此您可能希望在开始时手动运行所有 DDL,直到您对运行 DDL 脚本有足够的信心为止。我还建议您在没有两者的情况下永远不要运行在互联网上找到的脚本理解 it and testing它彻底,尤其是 DDL 脚本。
现在对于手头的事情,您可以查询*_TAB_PARTITIONS http://docs.oracle.com/cd/E11882_01/server.112/e25513/statviews_2108.htm#i1591118字典视图检索分区边界:
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'
该列的类型为LONG
(=已弃用的 LOB)因此我们几乎没有工具可以使用 SQL 进行过滤,我们必须使用 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',