千家信息网

Oracle范围分区应用实例

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,概述范围分区(Range partition):就是根据表的某个字段的值,以固定的一个范围作为一个分区来划分数据。实例:创建销售部门销售数据清单表:create table sales_list(or
千家信息网最后更新 2026年11月01日Oracle范围分区应用实例

概述

范围分区(Range partition):就是根据表的某个字段的值,以固定的一个范围作为一个分区来划分数据。

实例:

  1. 创建销售部门销售数据清单表:

    create table sales_list
    (order_id number(5),
    sales_name varchar2(20),
    order_amount number(10),
    order_date date
    )
    partition by range (order_date)
    (partition sales_201401 values less than(to_date('2014-02-01','yyyy-mm-dd')),
    partition sales_201402 values less than(to_date('2014-03-01','yyyy-mm-dd')),
    partition sales_201403 values less than(to_date('2014-04-01','yyyy-mm-dd')),
    partition sales_201404 values less than(to_date('2014-05-01','yyyy-mm-dd')),
    partition sales_201405 values less than(to_date('2014-06-01','yyyy-mm-dd')),
    partition sales_201406 values less than(to_date('2014-07-01','yyyy-mm-dd')),
    partition sales_201407 values less than(to_date('2014-08-01','yyyy-mm-dd')),
    partition sales_201408 values less than(to_date('2014-09-01','yyyy-mm-dd')),
    partition sales_201409 values less than(to_date('2014-10-01','yyyy-mm-dd')),
    partition sales_201410 values less than(to_date('2014-11-01','yyyy-mm-dd')),
    partition sales_201411 values less than(to_date('2014-12-01','yyyy-mm-dd')),
    partition sales_201412 values less than(to_date('2015-01-01','yyyy-mm-dd')),
    partition sales_201501 values less than(to_date('2015-02-01','yyyy-mm-dd')),
    partition sales_201502 values less than(to_date('2015-03-01','yyyy-mm-dd'))
    );

    创建了14个分区,14个段

    SQL> col partition_name format a20
    SQL> col segment_name format a20
    SQL> select segment_name,partition_name from user_segments where segment_name='SALES_LIST';

    SEGMENT_NAME PARTITION_NAME
    -------------------- --------------------
    SALES_LIST SALES_201401
    SALES_LIST SALES_201402
    SALES_LIST SALES_201403
    SALES_LIST SALES_201404
    SALES_LIST SALES_201405
    SALES_LIST SALES_201406
    SALES_LIST SALES_201407
    SALES_LIST SALES_201408
    SALES_LIST SALES_201409
    SALES_LIST SALES_201410
    SALES_LIST SALES_201411
    SALES_LIST SALES_201412
    SALES_LIST SALES_201501
    SALES_LIST SALES_201502

14 rows selected.

创建过程用于删除旧的分区并添加新的分区:

CREATE OR REPLACE PROCEDURE drop_add_partition AS
v_part_name VARCHAR2(100);
v_next_name VARCHAR2(100);
v_over_time NUMBER;
v_string VARCHAR2(10);
v_date DATE;
BEGIN
SELECT MIN(partition_name)
INTO v_part_name
FROM user_tab_partitions
WHERE table_name = 'SALES_LIST'; --找到当前最早的分区
SELECT MAX(partition_name)
INTO v_next_name
FROM user_tab_partitions
WHERE table_name = 'SALES_LIST'; --找到当前最晚的分区
SELECT substr(to_char(add_months(to_date(substr(v_next_name, 7, 6),
'yyyy-mm'),
1),
'yyyymmdd'),
1,
6)
INTO v_next_name
FROM dual; --拼接下一个新的分区的名称串
SELECT round(months_between(SYSDATE,
to_date(substr(v_part_name, 7, 6), 'yyyy-mm')))
INTO v_over_time
FROM dual;
--计算当前时间和最早分区的之间间隔的月数
v_string := to_char(add_months(to_date(v_next_name, 'yyyy-mm'), 1),
'yyyy-mm');
v_date := to_date(substr(v_string, 1, 4) || '-' ||
substr(v_string, 6, 2) || '-01',
'yyyy-mm-dd');
--拼接新的分区在创建的时候需要指定的截至时间点的串
IF v_over_time > 12
THEN
EXECUTE IMMEDIATE 'alter table sales_list drop partition ' ||
v_part_name; --删除旧的分区
EXECUTE IMMEDIATE 'alter table sales_list add partition SALES_' ||
REPLACE(v_next_name, '-', '') ||
' values less than (''' || v_date || ''')'; --添加新的分区
END IF;
EXCEPTION
WHEN OTHERS THEN
--异常处理
dbms_output.put_line(to_char(SQLCODE));
dbms_output.put_line(SQLERRM);
END;

SQL> set serveroutput on
SQL> exec drop_add_partition;

PL/SQL procedure successfully completed.

SQL> select segment_name,partition_name from user_segments where segment_name='SALES_LIST';

SEGMENT_NAME PARTITION_NAME
-------------------- --------------------
SALES_LIST SALES_201402
SALES_LIST SALES_201403
SALES_LIST SALES_201404
SALES_LIST SALES_201405
SALES_LIST SALES_201406
SALES_LIST SALES_201407
SALES_LIST SALES_201408
SALES_LIST SALES_201503
SALES_LIST SALES_201409
SALES_LIST SALES_201410
SALES_LIST SALES_201411
SALES_LIST SALES_201412
SALES_LIST SALES_201501
SALES_LIST SALES_201502

14 rows selected.

创建后台作业:
declare
job number;
begin
dbms_job.submit(job,'drop_add_partition;',sysdate,'sysdate+1'); --每天运行一次,创建这个job的时候就要执行一次
commit;
end;

范围 数据 时候 时间 销售 实例 之间 名称 后台 字段 就是 清单 过程 部门 作业 处理 运行 应用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东猪兼强互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 朗新科技与工业互联网 平安科技 互联网 奇士达互联网科技 撒么互联网科技公司 哈尔滨秒房互联网科技有限公司 互联网科技产品 广州慧亚互联网科技怎么样 承德科技产业互联网发展 互联网还是高科技吗 移动互联网年度科技创新 互联网科技大奖都有哪些公司 互联网科技人工智能实验室 允成互联网科技有限公司融资 华夏恒生互联网科技013171 佛山市翊博互联网络科技有限公司 用友工业互联网科技发展 工业互联网科技成果转化 安徽九吞吴互联网科技有限公司 科技企业和互联网企业 科技信息互联网 互联网金融 金融科技 长亮科技 互联网金融 撒么互联网科技公司 互联网企业科技类企业如何做账 云南省自由互联网科技有限公司 广州燕处互联网科技有限公司 互联网科技创新创业项目 银川新华互联网科技学校招聘
0