Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6546649
  • 博文数量: 1005
  • 博客积分: 8199
  • 博客等级: 中将
  • 技术积分: 13071
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-25 20:19
个人简介

脚踏实地、勇往直前!

文章分类

全部博文(1005)

文章存档

2020年(2)

2019年(93)

2018年(208)

2017年(81)

2016年(49)

2015年(50)

2014年(170)

2013年(52)

2012年(177)

2011年(93)

2010年(30)

分类: Oracle

2011-08-19 15:51:37

-- 创建Range List分区表

  1. create table TB_HXL_USER

  2. (
  3.   STATEDATE DATE not null,
  4.   PROVCODE NUMBER not null,
  5.   USERNUMBER VARCHAR2(13) not null,
  6.   REM1 VARCHAR2(1024),
  7.   CREATE_DATE DATE,
  8.   CREATE_BY NUMBER,
  9.   LAST_UPDATE_DATE DATE,
  10.   LAST_UPDATE_BY NUMBER
  11. )

  12. partition by range (statedate) subpartition by list(provcode)
  13. subpartition template (
  14.  subpartition p1 values (1) tablespace USERS,
  15.  subpartition p2 values (2) tablespace USERS,
  16.  subpartition p3 values (3) tablespace USERS,
  17.  subpartition p4 values (4) tablespace USERS,
  18.  subpartition p5 values (5) tablespace USERS
  19.  )
  20. (
  21.   partition HXL_USER_20110516 values less than (TO_DATE(' 2011-05-17 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  22.     tablespace USERS
  23.     pctfree 10
  24.     initrans 1
  25.     maxtrans 255
  26.     storage
  27.     (
  28.       initial 64K
  29.       next 1M
  30.       minextents 1
  31.       maxextents unlimited
  32.     )
  33. );
  34. -- global index

  35. create unique index idx_tb_hxl_user_u1 on tb_hxl_user(statedate,provcode,usernumber);

 

-- 1.增加分区

若在范围分区的表里创建了maxvalue分区,则不能新增表分区(报ora-14074错误), 但可以使用分区拆分.范围分区表新增分区后,不管是本地索引还是全局索引,都不会失效.

  1. Alter Table TB_HXL_USER Add Partition HXL_USER_20110517 values less than (TO_DATE(' 2011-05-18 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
-- 2.更新子分区模板
更新了子分区模板后,以后新建得分区会按照新的模板创建子分区,但现有的分区中的子分区保持不变
  1. Alter Table TB_HXL_USER Set Subpartition Template
  2. (
  3.  subpartition p1 values (1) tablespace USERS,
  4.  subpartition p2 values (2) tablespace USERS,
  5.  subpartition p3 values (3) tablespace USERS,
  6.  subpartition p4 values (4) tablespace USERS,
  7.  subpartition p5 values (5) tablespace USERS,
  8.  subpartition p_default values (default) tablespace Users
  9. )
--3.清空子分区模板
清空子分区模板后,以后新建分区的时候,系统默认会创建一个子分区。同样的,清空子分区只对新建的分区有效.
  1. alter table tb_hxl_user set subpartition template();
 
-- 4.查询某个分区
  1. select * from TB_HXL_USER partition(HXL_USER_20110516);
-- 5.查询某个子分区
  1. select * from TB_HXL_USER subpartition(p31);
--6.查询子分区模板
  1. Select *
  2. From dba_subpartition_templates
--拆分默认子分区
--拆分后的子分区索引会失效
  1. insert into tb_hxl_user(statedate,provcode,usernumber)
  2. values(date'2011-05-16',6,'123');
  3. commit;

  4. alter table tb_hxl_user
  5.  split subpartition hxl_user_20110516_p_default
  6.  values (6) into (
  7.  subpartition hxl_user_20110516_p6,
  8.  subpartition hxl_user_20110516_p_default
  9.  );
--查询某个符合分区表是否有默认子分区
  1. Select a.subpartition_name,a.high_value
  2.   From dba_tab_subpartitions a
  3.   Join Dba_Objects b
  4.     On (a.Table_Owner = b.Owner
  5.         And a.Table_Name = b.Object_Name
  6.         And a.subPartition_Name = b.Subobject_Name
  7.        )
  8.  Where b.Object_Id In
  9.        (Select a.Obj#
  10.           From sys.Tabsubpart$ a
  11.           Join Sys.Obj$ b
  12.             On (a.Obj# = b.Obj#)
  13.           Join Sys.User$ c
  14.             On (b.Owner# = c.User#)
  15.          Where Upper(Long_To_Char(a.Rowid, 'SYS', 'TABSUBPART$', 'HIBOUNDVAL'))
  16.          In ('DEFAULT','MAXVALUE')
  17.            And c.Name = 'HXL' --schema name

  18.         )
  19.    And a.table_name = 'TB_HXL_USER'
    --long_to_char函数
    CREATE OR REPLACE FUNCTION LONG_TO_CHAR( in_rowid rowid,in_owner
    varchar,in_table_name varchar,in_column varchar2)
    RETURN varchar AS
    text_c1 varchar2(32767);
    sql_cur varchar2(2000);
    --
    begin
      sql_cur := 'select '||in_column||' from
    '||in_owner||'.'||in_table_name||' where rowid =
    '||chr(39)||in_rowid||chr(39);
      --dbms_output.put_line (sql_cur);
      execute immediate sql_cur into text_c1;
      text_c1 := substr(text_c1, 1, 4000);
      RETURN TEXT_C1;
    END;

-- 查询某个分区表是否有默认分区
  1. Select a.*
  2.   From Dba_Tab_Partitions a
  3.   Join Dba_Objects b
  4.     On (a.Table_Owner = b.Owner And a.Table_Name = b.Object_Name And
  5.        a.Partition_Name = b.Subobject_Name)
  6.  Where b.Object_Id In (Select a.Obj#
  7.                          From Sys.Tabpartv$ a
  8.                          Join Sys.Obj$ b
  9.                            On (a.Obj# = b.Obj#)
  10.                          Join Sys.User$ c
  11.                            On (b.Owner# = c.User#)
  12.                         Where Upper(Sys.Dbms_Metadata_Util.Long2varchar(10,
  13.                                                                         'SYS.TABPARTV$',
  14.                                                                         'HIBOUNDVAL',
  15.                                                                         a.Rowid)) =
  16.                               'DEFAULT'
  17.                           And c.Name = 'HXL' --schema name

  18.                        )
  19.    And a.table_name = 'TB_HXL_USER' -- table name
 
阅读(7186) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~