当前位置:  数据库>NOSQL iis7站长之家

Oracle 自动拓展分区的实现(11g后使用interval分区)

    来源: 互联网  发布时间:2017-05-31

    本文导语: 创建 ERROR TABLE : create sequence seq_error_log_id ;create table error_log (id number , unit_name varchar2 (30),                            err_code varchar2(100 ) ,                            err_desc varchar2(4000 ),                            err_da...

创建 ERROR TABLE :

create sequence seq_error_log_id ;
create table error_log (id number , unit_name varchar2 (30),
                            err_code varchar2(100 ) ,
                            err_desc varchar2(4000 ),
                            err_date date) ;

自动拓展分区包:

create or replace package dba_tools is

  -- Author  : RenFj
  -- Created : 7/24/2013 9:26:12 AM
  -- Purpose : My DBA's utility
  --
  --
  YEAR constant varchar2(1) := 'Y' ;
  MONTH constant varchar2(1) := 'M' ;
  DAY constant varchar2(1) := 'D' ;

 

 

QUARTER constant varchar2(1) := 'Q' ;

-- ******No matter you understand it or not , I do .******
  -- create table log_errors (id number , unit_name varchar2(30),
  --                          err_code varchar2(100) ,
  --                          err_desc varchar2(4000),
  --                          err_date date) ;
  -- Log errors which raised in the programs .
  -- p_unit_name              program name
  -- p_sqlc                    error code (sqlcode)
  -- p_sqler                  error message (sqlerrm)
  --
 
 
  procedure err_log(p_unit_name varchar2,
                    p_sqlc      varchar2,
                    p_sqler    varchar2);

 
  -- Auto extend partitions with the specificed table in the program .
  -- tb_name    Specified table name which need to extend partitions.
  -- part_iden  Partition identifier
  -- The following identifier can be used :
  --    d        day
  --    m        month
  --    q        quarter
  --    y        year
  -- interval_num  Interval number , that means the additional partition values less than (sysdate+part_iden*interval_num)
  -- This program need partition's name has roles . Like ($table_name||$lessthan_date_string)order_20130101
  procedure dba_autoextend_partitions(p_tb_name      varchar2,
                                      p_part_iden    varchar2,
                                      p_interval_num number);


end dba_tools;


create or replace package body dba_tools is

  procedure err_log(p_unit_name varchar2,
                    p_sqlc      varchar2,
                    p_sqler    varchar2) is
    PRAGMA AUTONOMOUS_TRANSACTION ; --autonomous transaction .
  begin
    -- No exception handle in this unit .
    insert into error_log
      (id, unit_name, err_code, err_desc, err_date)
    values
      (seq_error_log_id.nextval, p_unit_name, p_sqlc, p_sqler, sysdate);
    commit;
  end;

  procedure dba_autoextend_partitions(p_tb_name      varchar2,
                                      p_part_iden    varchar2,
                                      p_interval_num number) is
    d_last_part_dat      date;          --最后一个partition 范围中的截止时间
    d_next_dat          date;          --这一次的创建的partition的截止时间
    v_part_less_than_val varchar2(4000 ); --less than 字符串
    v_part_name          varchar2(30 )  ; --partition 的名称
    v_add_part_sql      varchar2(4000 ); --add partition 的sql语句
  begin
    --查询出最后一个创建的partition的截止时间,partition的名称格式必须为xxxx_yyyymmdd
    --例如orders_20120101 其中20120101表示创建的partition的截止时间
    select to_date(regexp_replace(partition_name,
                                  '(.*)(2[0-9]{3}[0-9]{4})',
                                  '2'),
                  'yyyymmdd')
      into d_last_part_dat
      from (select max(partition_position) over( partition by table_name) mn,
                  t.*
              from user_tab_partitions t
            where table_name = upper(p_tb_name)) t
    where t.mn = partition_position;
    --根据参数p_part_iden以及p_interval_num计算出这一次创建的partition的截止时间
    --d 表示天,m表示月,q表示季度,y表示年度
    if p_part_iden in ('d', 'D') then
      d_next_dat := d_last_part_dat + p_interval_num;
    elsif p_part_iden in ('m', 'M') then
      d_next_dat := add_months(trunc(d_last_part_dat, 'MM'), p_interval_num);
    elsif p_part_iden in ('q', 'Q') then
      d_next_dat := add_months(trunc(d_last_part_dat, 'Q'),
                              3 * p_interval_num);
    elsif p_part_iden in ('y', 'Y') then
      d_next_dat := add_months(trunc(d_last_part_dat, 'Q'),
                              12 * p_interval_num);
    else
      raise_application_error(- 20999,
                              'Type following identifier with p_part_iden : d(day) , m(month) , q(quarter) , y(year) .');
    end if ;
    --根据截止时间拼装分区名称v_part_name 以及 less than 子句v_part_less_than_val
    --example: v_part_name := ORDERS_20120101
    --        v_part_less_than_val := TO_DATE(TO_CHAR(20120101,'YYYYMMDD'))
    v_part_name          := upper(p_tb_name) || '_' ||
                            to_char(d_next_dat, 'yyyymmdd');
    v_part_less_than_val := 'to_date(' || to_char(d_next_dat, 'yyyymmdd') ||
                            ',''yyyymmdd'')';
    --拼装的添加分区的sql语句v_add_part_sql
    -- example : ALTER TABLE print_media_part ADD PARTITION p4 VALUES LESS THAN (400)
    v_add_part_sql := 'ALTER TABLE '
                  || p_tb_name
                  || ' ADD PARTITION '
                  || v_part_name
                  || ' VALUES LESS THAN ('
                  || v_part_less_than_val
                  || ')';
 
    execute immediate v_add_part_sql;
  exception
    when others then
      err_log( 'dba_autoextend_partitions', sqlcode , sqlerrm);
  end;

end dba_tools;

创建测试表

CREATE TABLE orders
( prod_id NUMBER(6)
, order_time DATE
, quantity NUMBER(3)
, price NUMBER(10,2)
)
tablespace users
PARTITION BY RANGE (order_time)
( PARTITION order_before VALUES LESS THAN (TO_DATE('20100101','yyyymmdd'))
, PARTITION order_20100101 VALUES LESS THAN (TO_DATE('20110101','yyyymmdd'))
, PARTITION order_20110101 VALUES LESS THAN (TO_DATE('20120101','yyyymmdd'))
, PARTITION order_20120101 VALUES LESS THAN (TO_DATE('20130101','yyyymmdd'))
);

测试:

SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE from user_tab_partitions where table_name='ORDERS' ;
 
TABLE_NAME                    PARTITION_NAME                HIGH_VALUE
------------------------------ ------------------------------ --------------------------------------------------------------------------------
ORDERS                        ORDER_20100101                TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_20110101                TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_20120101                TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_BEFORE                  TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

 

SQL> exec dba_tools.dba_autoextend_partitions('ORDERS','y',2) ;
 
PL/SQL procedure successfully completed
 
SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE from user_tab_partitions where table_name='ORDERS' ;
 
TABLE_NAME                    PARTITION_NAME                HIGH_VALUE
------------------------------ ------------------------------ --------------------------------------------------------------------------------
ORDERS                        ORDERS_20140101                TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_20100101                TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_20110101                TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_20120101                TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_BEFORE                  TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

 

SQL> exec dba_tools.dba_autoextend_partitions('ORDERS','q',2) ;
 
PL/SQL procedure successfully completed
 
SQL> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE from user_tab_partitions where table_name='ORDERS' ;
 
TABLE_NAME                    PARTITION_NAME                HIGH_VALUE
------------------------------ ------------------------------ --------------------------------------------------------------------------------
ORDERS                        ORDERS_20140101                TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDERS_20140701                TO_DATE(' 2014-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_20100101                TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_20110101                TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_20120101                TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
ORDERS                        ORDER_BEFORE                  TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
 
6 rows selected

尽情测试吧。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,