gpt4 book ai didi

oracle - 删除两个月以上的分区

转载 作者:行者123 更新时间:2023-12-04 22:22:00 24 4
gpt4 key购买 nike

我有一个带分区的表,基于日期字段。现在,我必须编写一个程序来删除所有两个月以上的分区,即test_date大于两个月的分区。我该怎么做?

create table test_table
(
test_id number,
test_date date,
constraint pk_test primary key (test_id)
)
partition by range (test_date)
(
PARTITION pt01122012 VALUES LESS THAN (TO_DATE('01-DEC-
2012', 'DD-MON-YYYY')),
PARTITION pt01022013 VALUES LESS THAN (TO_DATE('01-FEB-
2013', 'DD-MON-YYYY')),
PARTITION pt01042013 VALUES LESS THAN (TO_DATE('01-APR-
2013', 'DD-MON-YYYY')),
PARTITION pt01062013 VALUES LESS THAN (TO_DATE('01-JUN-
2013', 'DD-MON-YYYY')),
PARTITION pt01082013 VALUES LESS THAN (TO_DATE('01-AUG-
2013', 'DD-MON-YYYY'))
);

提前致谢...

最佳答案

首先,我想指出的是分区是Oracle中的高级主题,因此您可能希望一开始就手动运行所有DDL,直到您对运行DDL脚本有足够的信心为止。我还建议您不要运行互联网上找到的脚本,而不要让了解并且不彻底地测试,尤其是DDL脚本。

现在,对于手头的事情,您可以查询 *_TAB_PARTITIONS 词典 View 以检索分区边界:

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',

关于oracle - 删除两个月以上的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14933828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com