为含有分区及子分区的模型添加分区。
发布时间:2021-01-14 01:04:47 所属栏目:MySql教程 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 create or replace procedure p_test_gy(v_datacycle_id varchar2,--添加分区的上限值 v_entity_owner varchar2,v_entity_name varchar2,v_retcode ou
|
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 create or replace procedure p_test_gy(v_datacycle_id varchar2,--添加分区的上限值
v_entity_owner varchar2,v_entity_name varchar2,v_retcode out varchar2,v_retinfo out varchar2) is
v_cnt1 number; --实体检测
v_cnt2 number; --分区是否存在检测
v_cnt3 number; --模板子分区是否存在检测
v_part_type varchar2(30); --分区类型
v_subpart_type varchar2(30); --子分区类型
v_part_value_max varchar2(30); --分区最大值
v_part_style varchar2(30); --分区命名格式
v_part_value varchar2(30); --分区值变量
v_sql varchar2(4000); --动态执行SQL
v_sub_template varchar2(4000); --调整模板子分区
v_high_value long; --子分区值变量
v_subpart_value varchar2(30); --子分区值变量
/*v_pkg
v_procname */
begin
/*--插入日志部分
p_insert_log(v_acct_month,v_pkg,v_procname,v_prov_id,sysdate,'');*/
--检测输入参数是否有误
select count(0)
into v_cnt1
from sys.dba_objects
where owner = v_entity_owner
and object_name = v_entity_name
and object_type = 'TABLE';
if v_cnt1 = 0 then
v_retcode := 'FAIL';
v_retinfo := '目标表信息输入有误';
else
--检测目标表有无分区
select count(0)
into v_cnt2
from sys.dba_part_tables t
where t.owner = v_entity_owner
and t.table_name = v_entity_name;
if v_cnt2 = 0 then
v_retcode := 'SUCCESS';
v_retinfo := '目标表无分区';
else
--检测分区是否已存在
select regexp_replace(max(t.partition_name),'[^0-9]',''),regexp_replace(max(t.partition_name),'[0-9]','')
into v_part_value_max,v_part_style
from sys.dba_tab_partitions t
where t.table_owner = v_entity_owner
and t.table_name = v_entity_name;
select partitioning_type,subpartitioning_type
into v_part_type,v_subpart_type
from sys.dba_part_tables t
where t.owner = v_entity_owner
and t.table_name = v_entity_name;
--分区已存在&分区是LIST/HASH分区
if v_part_value_max >= v_datacycle_id OR v_part_type <> 'RANGE' then
v_retcode := 'SUCCESS';
v_retinfo := '分区已存在';
else
select count(0)
into v_cnt3
from sys.dba_subpartition_templates
where table_name = v_entity_name
and user_name = v_entity_owner;
--无子分区&有子分区且为模板子分区
if v_part_type = 'RANGE' AND
((v_subpart_type = 'LIST' AND v_cnt3 <> 0) OR
nvl(v_subpart_type,'**') = 'NONE') then
v_part_value := to_char(add_months(to_date(v_part_value_max,'yyyymm'),1),'yyyymm');
while v_part_value <= v_datacycle_id loop
v_sql := 'alter table ' || v_entity_owner || '.' ||
v_entity_name || ' add partition ' || v_part_style ||
v_part_value || '
values less than (''' ||
to_char(add_months(to_date(v_part_value,'yyyymm') || ''') tablespace ';
--日志检索
/*dbms_output.put_line(v_sql);*/
--需要分配分区(或者建表设置默认表空间)
execute immediate v_sql;
v_part_value := to_char(add_months(to_date(v_part_value,'yyyymm');
end loop;
v_retcode := 'SUCCESS';
v_retinfo := '成功';
else
/*--顺序不太好看
select
rtrim(wmsys.wm_concat(' subpartition ' || substr(subpartition_name,length(partition_name)+2) || ' values ( ''' ||
regexp_replace(substr(subpartition_name,length(partition_name)+2),'') || ''' ) '),',') into v_sub_template
from sys.dba_tab_subpartitions
where table_owner = v_entity_owner
and partition_name = v_part_value_max
and table_name = v_entity_name;*/
--有子分区且非模板子分区
v_sub_template := 'alter table ' || v_entity_owner || '.' ||
v_entity_name || '
set subpartition template(';
--''' ||regexp_replace(substr(subpartition_name,length(partition_name) + 2),'') || '''
for t in (select /*+parallel(sub,4)*/*
from sys.dba_tab_subpartitions sub
where table_owner = v_entity_owner
and partition_name = v_part_style || v_part_value_max
and table_name = v_entity_name
order by length(regexp_replace(subpartition_name,'')),subpartition_name) loop
v_high_value:=t.high_value;
v_subpart_value:=substr(v_high_value,1,4000);
/*if v_subpart_value= 'DEFAULT' then
v_subpart_value:='''DEFAULT''';
end if;*/
v_sub_template := v_sub_template ||' subpartition ' ||
substr(t.subpartition_name,length(t.partition_name) + 2) ||
' values ( '||v_subpart_value||' ),' ;
end loop;
--日志检索
dbms_output.put_line(rtrim(v_sub_template,') || ')');
insert into dm_check_log
select rtrim(v_sub_template,') || ')',v_datacycle_id,sysdate
from dual;
commit;
execute immediate rtrim(v_sub_template,') || ')';
v_part_value := to_char(add_months(to_date(v_part_value_max,'yyyymm') || ''') tablespace ';
/*dbms_output.put_line(v_sql);*/
execute immediate v_sql;
--需要分配分区(或者建表设置默认表空间)
v_part_value := to_char(add_months(to_date(v_part_value,'yyyymm');
end loop;
v_retcode := 'SUCCESS';
v_retinfo := '成功';
end if;
end if;
end if;
end if;
end;
以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


