截断两个月以上的分区

时间:2018-09-09 07:25:40

标签: oracle truncate database-partitioning

如何截断具有两个月以上数据的分区?

例如,我有下面的表/分区名称:

select table_name, partition_name from all_tab_partitions where table_name='TABLENAME';

TABLENAME   partitionname1_P30    30
TABLENAME   partitionname2_P60    60 
TABLENAME   partitionname3_P90    90
TABLENAME   partitionname4_P120   120
TABLENAME   partitionname5_P150   150
TABLENAME   partitionname6_P180   180 
TABLENAME   partitionname7_210    210
TABLENAME   partitionname8_P240   240
TABLENAME   partitionname9_P270   270
TABLENAME   partitionname10_P300  300
TABLENAME   partitionname11_P330  330
TABLENAME   partitionname12_P360  360  

表每月进行分区。如果我们当前在9月,该如何截断两个月以上的分区?

期望的是,只有Aug-Sep(分区名8-9)中的记录会保留,而其余部分将被截断。

CREATE TABLE dbo1.TABLENAME
( PARTITION_ID NUMBER(4, 0) NOT NULL, 
TABLE_DATE DATE NOT NULL, 
TABLE_TIMESTAMP NUMBER(19, 0) NOT NULL, 
TABLE_BUNDLE_ID VARCHAR2(240 BYTE) NOT NULL, 
TABLE_TYPE NUMBER(8, 0) NOT NULL, 
TABLE_SEVERITY NUMBER(19, 0) NOT NULL,
TABLE_FACILITY NUMBER(19, 0) NOT NULL,
TABLE_HOST VARCHAR2(120 BYTE) NOT NULL,
TABLE_PROCESS VARCHAR2(240 BYTE) NOT NULL,
TABLE_SYSTEM VARCHAR2(240 BYTE) NOT NULL,
TABLE_SESSION_ID VARCHAR2(240 BYTE) NOT NULL,
TABLE_PRINCIPAL VARCHAR2(120 BYTE) NOT NULL,
OBJECT_ID VARCHAR2(120 BYTE),
OBJECT_TYPE VARCHAR2(2 BYTE),
CLIENT_HOST VARCHAR2(120 BYTE),
ACCESS_HOST VARCHAR2(120 BYTE),
SCOPE_ID VARCHAR2(120 BYTE),
STATUS NUMBER(19, 0),
OBJECT_HISTORY NUMBER(19, 0),
TABLE_DETAILS VARCHAR2(4000 BYTE) 
) 
PARTITION BY RANGE (PARTITION_ID) 
(
PARTITION partitionname1_P30 VALUES LESS THAN (30) 
,<repeat partition by 30s up to 360, total of 12 partitions>

1 个答案:

答案 0 :(得分:0)

您可以这样做:

class HomePage(Page):
    body = RichTextField(blank=True)

    def special_events(self):
        return EventPage.objects.descendant_of(self)

这将适用于基于RANGE或INTERVAL的分区,但是在这种情况下,您的需求将毫无用处,因为您将永远保留空分区。通常,您会删除旧的分区,为此只需将const chargeCard = async ( stripeToken, amount, currency, phoneNumber, animalName, numberOfHorses ) => { try { const charge = await stripe.charges.create({ amount: amount.replace('.', ''), currency: currency, description: `Charge from ${phoneNumber} for ${animalName}`, source: stripeToken, metadata: { phoneNumber, animalName, numberOfHorses } }); return charge; } catch (error) { console.log(error); logger.error(error); return error; } } 替换为DECLARE CURSOR PartTables IS SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'TABLENAME'; highValue TIMESTAMP; BEGIN FOR aTab IN PartTables LOOP EXECUTE IMMEDIATE 'BEGIN :ret := '||aTab.HIGH_VALUE||'; END;' USING OUT highValue; IF highValue < ADD_MONTHS(SYSDATE, -2) THEN EXECUTE IMMEDIATE 'ALTER TABLE TABLENAME TRUNCATE PARTITION '||aTab.PARTITION_NAME||' UPDATE INDEXES'; END IF; END LOOP; END;

如果您的分区基于LIST,即月号,解决方案将是这样:

TRUNCATE

根据您奇怪的分区定义,条件将是

DROP

但是如果您在12月26日至31日之间运行该过程,则可能会遇到问题。