Oracle分区表及实现动态添加分区

原创
2021/04/27 11:26
阅读数 847

Oracle分区表说明:数据存储对于数据量比较大的表进行分区管理,分区的依据一般是数据日期字段,每月或者每天数据存储在一个指定的分区中,通过分区进行过滤实现快速查询数据。

---------------------------------------- 存储过程执行日志(分区表) ----------------------------------------
--DROP TABLE SQL_LOG PURGE;
CREATE TABLE SQL_LOG(
RQ          VARCHAR2(6 BYTE),
DATETIME    DATE,
PRO_NAME    VARCHAR2(60 BYTE),
PRO_PARAM   VARCHAR2(10 BYTE),
MSG         VARCHAR2(500 BYTE))
PARTITION BY LIST(RQ)(PARTITION M202104 VALUES('202104'));
COMMENT ON COLUMN SQL_LOG.RQ IS '日期';
COMMENT ON COLUMN SQL_LOG.DATETIME IS '时间';
COMMENT ON COLUMN SQL_LOG.PRO_NAME IS '程序名称';
COMMENT ON COLUMN SQL_LOG.PRO_PARAM IS '程序参数';
COMMENT ON COLUMN SQL_LOG.MSG IS '错误信息';

----------------------------------- 添加分区存储过程(表名为SQL_LOG) ----------------------------------------
create or replace PROCEDURE ADD_PARTITION(P_DATE IN DATE) AS
    L_MSG   VARCHAR2(500 BYTE);
    L_DATE  VARCHAR2(6 BYTE) := TO_CHAR(P_DATE,'YYYYMM');
BEGIN
    ----- SQL_LOG -----
    BEGIN
        EXECUTE IMMEDIATE 'ALTER TABLE SQL_LOG ADD PARTITION M'||L_DATE||' VALUES('''||L_DATE||''')';
    EXCEPTION WHEN OTHERS THEN
        L_MSG:=SUBSTR(SQLERRM,1,400);
        INSERT INTO SQL_LOG(RQ,PRO_NAME,PRO_PARAM,MSG,DATETIME) VALUES(TO_CHAR(SYSDATE,'YYYYMM'),'ADD_PARTITION_SQL_LOG',L_DATE,L_MSG,SYSDATE);
        COMMIT;
    END;

    ----- SYS_LOG2 -----
    /*BEGIN
        EXECUTE IMMEDIATE 'ALTER TABLE SYS_LOG2 ADD PARTITION M'||L_DATE||' VALUES('''||L_DATE||''')';
    EXCEPTION WHEN OTHERS THEN
        L_MSG:=SUBSTR(SQLERRM,1,400);
        INSERT INTO SQL_LOG(RQ,PRO_NAME,PRO_PARAM,MSG,DATETIME) VALUES(TO_CHAR(SYSDATE,'YYYYMM'),'ADD_PARTITION_SYS_LOG',L_DATE,L_MSG,SYSDATE);
        COMMIT;
    END;*/
    
EXCEPTION WHEN OTHERS THEN
    L_MSG:=SUBSTR(SQLERRM,1,400);
    INSERT INTO SQL_LOG(RQ,PRO_NAME,PRO_PARAM,MSG,DATETIME) VALUES(TO_CHAR(SYSDATE,'YYYYMM'),'ADD_PARTITION',L_DATE,L_MSG,SYSDATE);
    COMMIT;
END;
/

------------------------------- 添加分区作业(自动执行) -------------------------------
BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
            job_name => '"ADD_PARTITION_JOB"',
            job_type => 'PLSQL_BLOCK',
            job_action => 'BEGIN ADD_PARTITION(SYSDATE); END;',
            number_of_arguments => 0,
            start_date => NULL,
            repeat_interval => 'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=1;BYMINUTE=0;BYSECOND=0',
            END_DATE => NULL,
            enabled => TRUE,
            auto_drop => FALSE,
            comments => 'add partition');
END;
/

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部
返回顶部
顶部