ms_output.put_Line('数据日期已经小于分区表最小日期,请重建表,重新设定最小日期分区');
raise less_than_latest_exception;
end if;
dbms_output.put_line('添加分区,按照指定频率添加分区');
MAX_PARTITION_DATE := MAX_PARTITION_DATE + ADD_FREQ;
while MAX_PARTITION_DATE <= curDate loop
begin
V_SQL := 'alter table '|| tname || ' add partition P' || to_char(MAX_PARTITION_DATE,'YYYYMMDD') || ' values less than ';
V_SQL := V_SQL || '(to_date(''' || to_char(MAX_PARTITION_DATE + ADD_FREQ,'YYYY-MM-DD') ||''',''YYYY-MM-DD''))';
--dbms_output.put_line(V_SQL);
execute immediate V_SQL;
MAX_PARTITION_DATE := MAX_PARTITION_DATE + ADD_FREQ;
end;
end loop;
else
dbms_output.put_line('清除分区中的数据');
V_SQL := 'alter table '||tname||' truncate partition P'||P_LABEL;
dbms_output.put_line(V_SQL);
execute immediate V_SQL;
end if;
end manage_table_partitions;
上边这段程序,默认情况下查询的是用户自己的表,如user_tab_partitions,user_part_tables,tab。所以,默认只能对用户自己的表的分区进行动态扩展和分区数据清除。如果想要对其他用户的表进行动态分区管理,需要将user_tab_partitions,user_part_tables,tab换成dba_tab_partitions,dba_part_tables,dba_tables,并且还需要有操作其他用户下表的权限。这样会导致权限放大,建议不要这么操作。
如果各个用户都需要使用动态分区扩展与清理,可以在每个用户下边部署这个存储过程,这样就不用跨用户之间动态管理分区。