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