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

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;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值