【问题标题】:Partition table rename automatically in ORACLEORACLE中的分区表自动重命名
【发布时间】:2020-07-11 20:31:28
【问题描述】:

我每个月都有很多桌子。分区名称为SYS_P***。我想自动更改它SYS_PYYYYMM。 我试过了 ALTER TABLE table_name RENAME PARTITION partition_name TO new_name;

这仅适用于 1 个分区名称。 如何总是更改分区名称?

【问题讨论】:

    标签: oracle partition


    【解决方案1】:

    我使用这个程序。它更通用,但适合您的需求:

    PROCEDURE MaintainPartitions IS 
    
        EXPRESSION_IS_OF_WRONG_TYPE EXCEPTION;
        PRAGMA EXCEPTION_INIT(EXPRESSION_IS_OF_WRONG_TYPE, -6550);
    
        CURSOR PartTables IS
        SELECT TABLE_NAME, INTERVAL
        FROM USER_PART_TABLES 
        WHERE TABLE_NAME LIKE 'P_%'
            AND PARTITIONING_TYPE = 'RANGE' 
        ORDER BY TABLE_NAME;
    
        CURSOR TabParts(aTableName VARCHAR2) IS 
        SELECT PARTITION_NAME, HIGH_VALUE
        FROM USER_TAB_PARTITIONS
        WHERE TABLE_NAME = aTableName
        ORDER BY PARTITION_POSITION;
    
        ym INTERVAL YEAR TO MONTH;
        ds INTERVAL DAY TO SECOND;
        newPartName VARCHAR2(30);
        PERIOD TIMESTAMP;
    
    BEGIN
    
        FOR aTab IN PartTables LOOP 
            BEGIN       
                EXECUTE IMMEDIATE 'BEGIN :ret := '||aTab.INTERVAL||'; END;' USING OUT ds;
                ym := NULL; 
            EXCEPTION 
                WHEN EXPRESSION_IS_OF_WRONG_TYPE THEN
                    EXECUTE IMMEDIATE 'BEGIN :ret := '||aTab.INTERVAL||'; END;' USING OUT ym;
                    ds := NULL;         
            END;            
    
            FOR aPart IN TabParts(aTab.TABLE_NAME) LOOP         
                EXECUTE IMMEDIATE 'BEGIN :ret := '||aPart.HIGH_VALUE||'; END;' USING OUT PERIOD;
                IF ds IS NOT NULL THEN
                    IF ds >= INTERVAL '7' DAY THEN
                        -- Weekly partition
                        EXECUTE IMMEDIATE 'BEGIN :ret := TO_CHAR('||aPart.HIGH_VALUE||' - :int, :fmt); END;' USING OUT newPartName, INTERVAL '1' DAY, '"P_"IYYY"W"IW';
                    ELSE
                        -- Daily partition
                        EXECUTE IMMEDIATE 'BEGIN :ret := TO_CHAR('||aPart.HIGH_VALUE||' - :int, :fmt); END;' USING OUT newPartName, INTERVAL '1' DAY, '"P_"YYYYMMDD';
                    END IF;
                ELSE
                    IF ym = INTERVAL '3' MONTH THEN
                        -- Quarterly partition 
                        EXECUTE IMMEDIATE 'BEGIN :ret := TO_CHAR('||aPart.HIGH_VALUE||' - :int, :fmt); END;' USING OUT newPartName, INTERVAL '1' DAY, '"P_"YYYY"Q"Q';
                    ELSE
                        -- Monthly partition
                        EXECUTE IMMEDIATE 'BEGIN :ret := TO_CHAR('||aPart.HIGH_VALUE||' - :int, :fmt); END;' USING OUT newPartName, INTERVAL '1' DAY, '"P_"YYYYMM';
                    END IF;
                END IF;
    
                IF newPartName <> aPart.PARTITION_NAME THEN
                    EXECUTE IMMEDIATE 'ALTER TABLE '||aTab.TABLE_NAME||' RENAME PARTITION '||aPart.PARTITION_NAME||' TO '||newPartName;
                END IF;             
            END LOOP;
        END LOOP;
    
    END MaintainPartitions; 
    

    【讨论】:

    • 谢谢!是工作。数据录入后的程序是否可行?
    • 它也应该适用于空分区,因为它使用HIGH_VALUE 而不是MAX(DATE_COLUMN) 之类的东西。当然它只重命名现有的分区。
    • 我的意思是,插入新的分区数据后,程序可以自动执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多