oracle 建立分区表

最近一段时间在做数据统计报表用到了表分区,所以最近就看了看,拿来研究研究。 

一.范围分区
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。

--例一取值范围:
CREATE TABLE CUSTOMER
(
    CUSTOMER_ID NUMBERNOTNULL PRIMARY KEY,
    FIRST_NAME  VARCHAR2(30)NOTNULL,
    LAST_NAME   VARCHAR2(30)NOTNULL,
    PHONE        VARCHAR2(15)NOTNULL,
    EMAIL        VARCHAR2(80),
    STATUS      CHAR(1)
)
PARTITION BY RANGE (CUSTOMER_ID)
(
    PARTITION CUS_PART1VALUESLESS THAN (100000) TABLESPACE CUS_TS01,
    PARTITION CUS_PART2VALUESLESS THAN (200000) TABLESPACE CUS_TS02,
    PARTITION  CUS_PART3VALUES LESS  THEN (MAXVALUE) TABLESPACE  CUS_TS02
)
--例二按时间划分(随着时间的增长,还需要添加分区表):
CREATE TABLE ORDER_ACTIVITIES
(
    ORDER_ID      NUMBER(7)NOTNULL,
    ORDER_DATE   DATE,
    TOTAL_AMOUNT NUMBER,
    CUSTOTMER_ID NUMBER(7),
    PAID          CHAR(1)
)
PARTITION BY RANGE (ORDER_DATE)
(
  PARTITION ORD_ACT_PART01VALUESLESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACE ORD_TS01,
  PARTITION ORD_ACT_PART02VALUESLESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,
  PARTITION ORD_ACT_PART03VALUESLESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03
)

二.列表分区
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

--这个是我在自己电脑上测试的实例,一个sql竞赛的资料库中的数据
create table p_t2(a1 number,a2 varchar2(10),a3 varchar2(30),a4 varchar2(10),a5 number)
    partitionbylist(a2)
    (partition p_tcp values('tcp') tablespace p1,
    partition p_udp values('udp') tablespace p2,
    partition p_icmp values('icmp') tablespace p3)

三.散列分区
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

CREATE TABLE HASH_TABLE
(
  COL NUMBER(8),
  INF VARCHAR2(100)
)
PARTITION BYHASH (COL)
(
  PARTITION PART01 TABLESPACE HASH_TS01,
  PARTITION PART02 TABLESPACE HASH_TS02,
  PARTITION PART03 TABLESPACE HASH_TS03
)
--简写:
CREATE TABLE emp
(
    empno NUMBER (4),
    ename VARCHAR2 (30),
    sal   NUMBER
)
PARTITION BY  HASH (empno) PARTITIONS 8
STORE IN(emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

四.组合范围散列分区
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。

CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE,
SALES_COST NUMBER(10),
STATUS VARCHAR2(20)
)
PARTITION BYRANGE(SALES_DATE) SUBPARTITIONBYLIST (STATUS)
(
   PARTITION P1VALUESLESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
          (
              SUBPARTITION P1SUB1VALUES('ACTIVE') TABLESPACE rptfact2009,
              SUBPARTITION P1SUB2VALUES('INACTIVE') TABLESPACE rptfact2009
          ),
   PARTITION P2VALUESLESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
          (
              SUBPARTITION P2SUB1VALUES('ACTIVE') TABLESPACE rptfact2009,
              SUBPARTITION P2SUB2VALUES('INACTIVE') TABLESPACE rptfact2009
          )
)

五.复合范围散列分区
这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

create table dinya_test
 (
 transaction_id numberprimarykey,
 item_id number(8)notnull,
 item_description varchar2(300),
 transaction_datedate
 )
 partitionbyrange(transaction_date)subpartitionbyhash(transaction_id)  subpartitions 3 storein(dinya_space01,dinya_space02,dinya_space03)
 (
     partition part_01valuesless than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
     partition part_02valuesless than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
     partition part_03valuesless than(maxvalue)
 );



### 使用方法 `GET_ITEM_INSTANCE_PROPERTY` 函数用于获取指定实例的项(Item)的属性值。该函数的语法如下: ```plsql GET_ITEM_INSTANCE_PROPERTY( item_name VARCHAR2, instance_num NUMBER, property NUMBER ) RETURN ANYDATA; ``` - `item_name`:指定项的名称,格式为 `block_name.item_name`。 - `instance_num`:项实例的编号。 - `property`:要获取的属性的编号,这些编号对应着不同的属性,如 `ITEM_VALUE` 示项的值。 示例代码: ```plsql DECLARE v_value ANYDATA; BEGIN v_value := GET_ITEM_INSTANCE_PROPERTY('dept.deptno', 1, ITEM_VALUE); -- 后续处理 v_value END; ``` ### 常见问题及解决方案 #### 1. Item 不存在 要保证在函数里使用的 Item 名称准确无误,包括大小写。Oracle Forms 对大小写敏感,所以 Item 名称的大小写必须和单设计时一致。同时要确认在当前单里,对应的 Block 和 Item 确实存在,可在单设计器中查看单结构。还要确保 Item 在当前作用域内是可见且可访问的,某些情况下,Item 可能在特定条件下才会显示或启用。另外要保证单已经完全加载,并且所有的 Block 和 Item 都已经初始化,可在合适的触发器(如 `WHEN - NEW - FORM - INSTANCE`)中执行相关代码。 ```plsql -- 示例代码,确保 item_name 准确 DECLARE v_value ANYDATA; BEGIN v_value := GET_ITEM_INSTANCE_PROPERTY('block_name.item_name', 1, ITEM_VALUE); -- 后续处理 END; ``` #### 2. 实例编号无效 要确保传入的实例编号是有效的,若实例编号超出了实际的实例数量,会导致错误。可以先通过 `GET_BLOCK_PROPERTY` 函数获取块中实例的数量,然后再使用有效的实例编号。 ```plsql DECLARE v_instance_count NUMBER; v_value ANYDATA; BEGIN v_instance_count := GET_BLOCK_PROPERTY('block_name', NUM_INSTANCES); IF v_instance_count > 0 THEN v_value := GET_ITEM_INSTANCE_PROPERTY('block_name.item_name', 1, ITEM_VALUE); -- 后续处理 END IF; END; ``` #### 3. 属性编号错误 要确保传入的属性编号是正确的,不同的属性有不同的编号。可参考 Oracle Forms 的官方文档来获取正确的属性编号。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值