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);
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;
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'
), 1),
'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'
),
1),
'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),
'[^0-9]'
,
''
) ||
''
' ) '
),
','
)
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('
;
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,
'[0-9]'
,
''
)),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'
),
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'
), 1),
'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'
),
1),
'yyyymm'
);
end
loop;
v_retcode :=
'SUCCESS'
;
v_retinfo :=
'成功'
;
end
if;
end
if;
end
if;
end
if;
end
;