设为首页 加入收藏

TOP

Oracle 动态添加分区的实现方法(一)
2018-12-02 22:09:00 】 浏览:21
Tags:Oracle 动态 添加 分区 实现 方法

在数据处理过程中,通常对于数据比较大的表进行分区管理,而分区的依据往往是数据日期,每一天或者每几天数据存储在一个指定的分区中,当数据量一天天增加后,通过分区进行过滤,有利于快速查询某一天的数据。


在向分区表中插入数据时,分区表必须有能够装载这条数据的分区,比如将2018-01-08的数据全部放在P20180102这个分区,而这个分区条件是数据日期小于等于2018-01-02,那么这条数据日期为2018-01-08的数据就无法insert到这张表,这样就会出现错误。


为了解决为分区表自动扩展分区的需求,我们编写了一个存储过程,用来在向表中insert数据时,动态的对表进行添加分区或清除分区。只需要在insert之前,执行下边存储过程即可。


示例代码如下:


create or replace procedure manage_table_partitions(
    tname varchar2,
    curDate date
) is
    IS_PART_EXISTS        integer          := 0;
    IS_TABLE_EXISTS        integer          := 0;
    IS_PART_TABLE          integer          := 0;
    P_LABEL                varchar2(30)    := to_char(curDate,'YYYYMMDD');
    MAX_PARTITION_DATE    date;
    MIN_PARTITION_DATE    date;
    TARGET_TABLE          varchar2(40)    := upper(trim(tname));
    V_SQL                  varchar2(3000)  := '';


-- 定义异常类型变量
    no_table_exception          exception;
    less_than_latest_exception  exception;


-- 固定参数
  ADD_FREQ                integer          := 1;
begin


    -- 查看这张表是否为分区表
    select count(*) into IS_PART_TABLE from user_part_tables
    where table_name = TARGET_TABLE;


    if IS_PART_TABLE <> 1 then
        select count(*) into IS_TABLE_EXISTS from tab where tname = TARGET_TABLE;
        if IS_TABLE_EXISTS <> 1 then
            dbms_output.put_line(tname||',这张表不存在');
            raise no_table_exception;
        end if;


        dbms_output.put_line(tname||',这张表不是分区表,将直接清空表中数据');
        V_SQL := 'truncate table ' || tname;
        execute immediate V_SQL;
        return ;
    end if;



    -- 查看分区是否存在
    select count(*) into IS_PART_EXISTS
    from user_tab_partitions
    where table_name = TARGET_TABLE
        and partition_name = 'P'||P_LABEL
    ;


    if IS_PART_EXISTS <> 1 then
   
        -- 查看分区表最大分区和最小分区
        select 
            max(to_date(substr(partition_name,2),'YYYY-MM-DD'))
            ,min(to_date(substr(partition_name,2),'YYYY-MM-DD'))
        into
            MAX_PARTITION_DATE
            ,MIN_PARTITION_DATE
        from user_tab_partitions
        where table_name = TARGET_TABLE
        group by table_name;


        -- 检查准备创建的分区是否小于当前表中分区最小日期
        if MIN_PARTITION_DATE > curDate then
            db
编程开发网

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Linux系统下virtuoso数据库安装与.. 下一篇MongoDB主从复制和副本集

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }