Oracle Split Partitions
1. 创建分离分区的存储过程
CREATE OR REPLACE Procedure SP_Split_Partition(
v_table_name_in in varchar2,
v_part_name_prifex_in in varchar2,
v_split_partition_source_in in varchar2,
v_tablespace_name_in in varchar2,
v_field_tablespace_name_in in varchar2,
v_create_partition_count_in in number
) is
/*
名称:SP_Split_Partition
描述:oracle分区表分离分区的存储过程
参数说明:
v_table_name_in 分区表表名称
v_part_name_prifex_in 分区名称前缀
v_split_partition_source_in 要分离的目标分区
v_tablespace_name_in in 分区表所在表空间
v_field_tablespace_name_in 特别字段特别分区SQL
v_create_partition_count_in 从现在开始创建多少个分区
*/
-- Local variables here
i integer; ---最后一个分区信息
cursor cur_utp(v_table_name_in in user_tab_partitions.table_name%TYPE) is
select *
from (select utp.table_name,
utp.tablespace_name,
utp.partition_name,
utp.high_value,
utp.high_value_length,
utp.partition_position
from user_tab_partitions utp
where utp.table_name = UPPER(v_table_name_in)
and utp.high_value_length<>8
order by utp.partition_position desc
) utp
where rownum = 1; v_high_value varchar2(255); --less than value信息
v_partition_max_date date; ---- 当前最大分区
v_sqlexec VARCHAR2(2000); --DDL语句变量
v_count number := 0;
v_interver number := 1; --步长间隔 单位(月)
v_tablespace_name varchar2(200); v_max_date_this_time date; begin
-- 根据v_create_partition_count_in, 得到最后要生成的分区日期
v_max_date_this_time:=last_day(add_months(trunc(SYSDATE), v_create_partition_count_in))+1; --取值
for utp in cur_utp(v_table_name_in) loop
v_high_value := substr(utp.high_value,11,10);
v_partition_max_date := to_date(v_high_value,'YYYY-MM-DD'); dbms_output.put_line('v_high_value:' || v_high_value); --如果没有给默认值
if (v_tablespace_name_in is null) then
v_tablespace_name := utp.tablespace_name;
else
v_tablespace_name := v_tablespace_name_in;
end if;
end loop; i:= 0;
v_partition_max_date := add_months(v_partition_max_date,v_interver); /************************************************************
alter table Article_Detail split partition Article_Detail_Others at(TO_DATE('2014-01-01', 'yyyy-mm-dd'))
into(
partition Article_Detail_201401 LOB (CONTENT_HTML) store as SECUREFILE (TABLESPACE wm_article_detail_clob) tablespace WM_ARTICLE_DETAIL,
partition Article_Detail_Others LOB (CONTENT_HTML) store as SECUREFILE (TABLESPACE wm_article_detail_clob) tablespace WM_ARTICLE_DETAIL
);
*************************************************************/ while v_partition_max_date <= v_max_date_this_time loop
v_SqlExec := 'ALTER TABLE ' || v_table_name_in || ' SPLIT PARTITION ' || v_split_partition_source_in || ' AT' ||
'(TO_DATE('''||to_char(v_partition_max_date, 'YYYY-MM-DD')||''',''YYYY-MM-DD'')) INTO(PARTITION '||
v_part_name_prifex_in || to_char(v_partition_max_date,'YYYYMM') || ' ' || v_field_tablespace_name_in ||
' TABLESPACE ' || v_tablespace_name || ', PARTITION '||v_split_partition_source_in||')';
dbms_output.put_line('Added Partition ' || i || '=' || v_SqlExec);
DBMS_Utility.Exec_DDL_Statement(v_SqlExec);
v_partition_max_date := add_months(v_partition_max_date,v_interver);
i:= i + 1;
end loop; v_count := v_count + i;
dbms_output.put_line('Added Partition Count:' || v_count); commit;
Exception
when OTHERS then
--ReturnValue:=-1003;
dbms_output.put_line('The SQLCode is: '||SQLCODE);
dbms_output.put_line('The SQLERRM is: '||SQLERRM); end SP_Split_Partition;
2. 创建调度分离分区的存储过程
CREATE OR REPLACE Procedure SP_Call_SP_Split_Partition is
begin update Article_Detail t set t.transfer_done_time=t.extracted_time where t.transfer_done_time is null;
commit; dbms_stats.gather_table_stats('WDM_APP','ARTICLE_DETAIL',partname=>'ARTICLE_DETAIL_OTHERS'); SP_Split_Partition(
'ARTICLE_DETAIL',
'ARTICLE_DETAIL_',
'ARTICLE_DETAIL_OTHERS',
'WM_ARTICLE_DETAIL',
'LOB (CONTENT_HTML) store as SECUREFILE (TABLESPACE wm_article_detail_clob)',
3
); SP_Split_Partition(
'ARTICLE_DATA',
'ARTICLE_DATA_',
'ARTICLE_DATA_OTHERS',
'WM_ARTICLE_DATA',
'',
3
); Exception
when OTHERS then
--ReturnValue:=-1003;
dbms_output.put_line('The SQLCode is: '||SQLCODE);
dbms_output.put_line('The SQLERRM is: '||SQLERRM); end SP_Call_SP_Split_Partition;
3. 创建相应的JOB, 并执行.
CREATE OR REPLACE PROCEDURE Job_SP_Call_SP_Split_Partition AS
JobNo user_jobs.job%TYPE;
BEGIN
begin
dbms_job.submit(JobNo, 'begin SP_Call_SP_Split_Partition; end;',
SYSDATE+1/1440,'TRUNC(SYSDATE+15)');
COMMIT;
end;
END;
/ call Job_SP_Call_SP_Split_Partition();
Oracle Split Partitions的更多相关文章
- pipe row的用法, Oracle split 函数写法.
为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行 ...
- Oracle Split 函数
为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行 ...
- Oracle split分区表引起ORA-01502错误
继上次删除分区表的分区遇到ORA-01502错误后[详细见链接:Oracle分区表删除分区引发错误ORA-01502: 索引或这类索引的分区处于不可用状态],最近在split分区的时候又遇到了这个问题 ...
- (转)pipe row的用法, Oracle split 函数写法.
本文转载自:http://www.cnblogs.com/newsea/archive/2010/12/14/1905482.html 关于 pipe row的用法2009/12/30 14:53 = ...
- oracle split 以及 简单json解析存储过程
BEGIN; 由于之前工作上需要在oracle中做split功能以及json格分解.然后经过一番google和优化整合,最后整理到一个存储过程包中,易于管理,代码如下: 1.包定义: CREATE O ...
- oracle split
select * from table(fun_strsplit('1,2,3,4,5')); 1.创建一个类型 ) 2.创建函数 CREATE OR REPLACE FUNCTION Fun_Str ...
- Oracle Split字符串
为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行 ...
- oracle split函数
PL/SQL 中没有split函数,需要自己写. 代码: ); --创建一个 type ,如果为了使split函数具有通用性,请将其size 设大些. --创建function create or r ...
- Partitioning & Archiving tables in SQL Server (Part 2: Split, Merge and Switch partitions)
Reference: http://blogs.msdn.com/b/felixmar/archive/2011/08/29/partitioning-amp-archiving-tables-in- ...
随机推荐
- mssql触发器demo
USE [pos]GO/****** Object: Trigger [dbo].[tr_insert] Script Date: 06/26/2014 09:27:19 ******/SET ANS ...
- Altium Designer生成网表 导出网表【worldsing笔记】
Design -> Netlist for project -> Protel
- 7个改变世界的Java项目
Java的开源生态系统是强大而健康的,这是我们(Oreilly)创建OSCON Java(Open Source Convention Java)的主要原因之一.在过去10年中,一些项目已经被广泛接受 ...
- iOS多线程拾贝------操作巨人编程
iOS多线程拾贝------操作巨人编程 多线程 基本 实现方案:pthread - NSThread - GCD - NSOperation Pthread 多平台,可移植 c语言,要程序员管理生命 ...
- vs之Nuget
1.http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 2.在Nuget控制台中安装特定版本: Install-Package <程序包 ...
- .NET 基础 一步步 一幕幕[面向对象之静态、非静态]
静态.非静态 先来看一段代码来区分静态与非静态: using System; using System.Collections.Generic; using System.Linq; using Sy ...
- iOS中的深复制与浅复制
很多语言中都有深复制浅复制的概念,如C++,ObjC等.简单来说,浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,但是两个内存区域里面的内容是一样的. 浅复制示意图: ...
- Go2Shell
1.背景 windows系统可以轻而易举地拿到文件所在目录, 但是mac显得想拿文件目录有点蛋疼.而Go2Shell可以快速定位到文件所在的目录. 2.安装配置 选择默认打开的终端软件 3.使用 进入 ...
- linux下hexdump和od命令:显示文件十六进制格式
Linux指令: od 示例用法: od -c hello Linux指令: od od命令用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进 ...
- SVN 中trunk、branches、tags都什么意思?
1.trunk是主分支,是日常开发进行的地方. 2.branches是分支.一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中.又比如为不同用户客制化的版 ...