CREATE OR REPLACE FUNCTION MASAMKt.fun_add_table_partitionst(
v_table_owner in varchar2,
v_table_name in varchar2,
v_partition_name in varchar2,
v_subpartition_name in varchar2,
v_object_type in varchar2,
v_value_type in varchar2,
v_values in integer,
v_tablespace in varchar2
)
----/************************************************************
----过 程 名: fun_add_table_partitions
----过程描述: 清空表或表分区,分区不存在的增加分区(适用于所有表、分区表)
----输入参数: 1、表的拥有者:masadw、masamk、masakr等
---- 2、表名
---- 3、分区名:带分区值的分区全名,例如sc_user_day_20071211
---- 4、子分区名:同3
---- 5、对象类型:仅限于三个值:table(表)、partition(分区表)、subpartition(带子分区的分区表)
---- 6、分区值的类型:仅限于三个值:integer(整型)、char(字符型)、date(日期型)
---- 7、分区值:整型的月份或日期(即使是日期型的分区值,也输入整型参数)
---- 8、表空间名称(不可以为空)
----输出参数: 执行状态(0、执功,-1、执行失败)
----调用的过程或函数:
----被哪些过程或函数调用:
----依赖的过程或函数:
----编写人员: ----**************************************************************
RETURN integer
AS
vv_task_name varchar2(30):='fun_add_table_partitions';
vv_task_pos varchar2(100);
vv_table_owner varchar2(30):=upper(trim(v_table_owner));
vv_table_name varchar2(30):=upper(trim(v_table_name));
vv_partition_name varchar2(30):=upper(trim(v_partition_name));
vv_subpartition_name varchar2(30):=upper(trim(v_subpartition_name));
vv_object_type varchar2(30):=upper(trim(v_object_type));
vv_value_type varchar2(30):=upper(trim(v_value_type));
vi_values integer:=v_values;
vv_tablespace varchar2(30):=upper(trim(v_tablespace));
vv_last_partition varchar2(30);
vi_result integer;
exc_error exception; -- 程序出错返回自定义异常
vi_flag integer:=0;
vv_sql varchar2(1000);
BEGIN
vv_task_pos := '参数有效性检验';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 1, vv_task_pos, null);
--检查用户名
if vv_table_owner is null then
vv_task_pos := '用户名不能为空';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 0, vv_task_pos, null);
raise exc_error;
end if;
--检查表名
if vv_table_name is null then
vv_task_pos := '表名不能为空';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 0, vv_task_pos, null);
raise exc_error;
end if;
--检查对象类型
if vv_object_type is null then
vv_task_pos := '对象类型不能为空';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 0, vv_task_pos, null);
raise exc_error;
end if;
--检查表空间
if vv_tablespace is null then
vv_task_pos := '表空间不能为空';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 0, vv_task_pos, null);
raise exc_error;
end if;
--参数检查通过,进入函数主体
vv_task_pos := '进入函数主体';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 2, vv_task_pos, null);
--对象类型是 TABLE 的表处理
if vv_object_type = 'TABLE' then
vv_task_pos := '该对象类型是 TABLE';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 3, vv_task_pos, null);
vi_flag := 0;
select count('a') into vi_flag
from all_tables t
where t.owner=vv_table_owner
and t.table_name=vv_table_name;
--如果表不存在,退出
if vi_flag = 0 then
vv_task_pos := '表 '||vv_table_owner||'.'||vv_table_name||' 不存在';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 4, vv_task_pos, null);
vi_result := 9;
raise exc_error;
else
--如果表存在,则清空此表
vv_task_pos := '清空表 '||vv_table_owner||'.'||vv_table_name;
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 4, vv_task_pos, null);
vv_sql := 'truncate table '||vv_table_owner||'.'||vv_table_name;
execute immediate vv_sql;
end if;
end if;
--对象类型是 PARTITION 的表处理
if vv_object_type = 'PARTITION' then
vv_task_pos := '该对象类型是 PARTITION';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 3, vv_task_pos, null);
--参数有效性检查
if vv_partition_name is null or
vv_value_type is null or
vi_values is null then
vv_task_pos := '分区表参数不能为空:缺少分区名、分区值类型或分区值';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 0, vv_task_pos, null);
raise exc_error;
end if;
vi_flag := 0;
select count('a') into vi_flag
from all_tab_partitions t
where t.table_owner=vv_table_owner
and t.table_name=vv_table_name
and t.partition_name=vv_partition_name;
--如果分区不存在,则建立该分区
if vi_flag = 0 then
vv_task_pos := '分区 '||vv_partition_name||' 不存在,建立此分区';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 4, vv_task_pos, null);
vv_sql := 'alter table '||vv_table_owner||'.'||vv_table_name||' add partition '
||vv_partition_name||' values('||case when vv_value_type='INTEGER' then ''
||vi_values||'' when vv_value_type='CHAR' then ''''||vi_values||''''
when vv_value_type='DATE' then 'to_date('||vi_values||',''yyyymmdd'')' end||')
tablespace '||vv_tablespace;
execute immediate vv_sql;
else
--如果分区存在,则情况此分区
vv_task_pos := '分区 '||vv_partition_name||' 存在,清空此分区';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 4, vv_task_pos, null);
vv_sql := 'alter table '||vv_table_owner||'.'||vv_table_name||' truncate partition '
||vv_partition_name;
execute immediate vv_sql;
end if;
end if;
--对象类型是 SUBPARTITION 的表处理
if vv_object_type = 'SUBPARTITION' then
vv_task_pos := '该对象类型是 SUBPARTITION';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 3, vv_task_pos, null);
--参数有效性检验
if vv_partition_name is null or
vv_subpartition_name is null or
vv_value_type is null or
vi_values is null then
vv_task_pos := '分区表参数不能为空:缺少分区名、子分区名、子分区值类型或子分区值';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 0, vv_task_pos, null);
raise exc_error;
end if;
--检查分区是否存在
vi_flag := 0;
select count('a') into vi_flag
from all_tab_partitions t
where t.table_owner=vv_table_owner
and t.table_name=vv_table_name
and t.partition_name=vv_partition_name;
--分区不存在的处理
if vi_flag = 0 then
vv_task_pos := '分区 '||vv_partition_name||' 及其子分区不存在,建立此分区';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 4, vv_task_pos, null);
vv_last_partition := to_char(add_months(to_date(vi_values,'yyyymmdd'),1),'yyyymm');
vv_sql := 'alter table '||vv_table_owner||'.'
||vv_table_name||' add partition '||vv_partition_name
||' values less than('||vv_last_partition||')
(subpartition '||vv_subpartition_name||' values('
||case when vv_value_type='INTEGER' then ''||vi_values||''
when vv_value_type='CHAR' then ''''||vi_values||''''
when vv_value_type='DATE' then 'to_date('||vi_values||',''yyyymmdd'')' end||') tablespace '
||vv_tablespace||')';
execute immediate vv_sql;
else
--分区存在,检查子分区是否存在
vi_flag := 0;
select count('a') into vi_flag
from all_tab_subpartitions t
where t.table_owner=vv_table_owner
and t.table_name=vv_table_name
and t.partition_name=vv_partition_name
and t.subpartition_name=vv_subpartition_name;
if vi_flag = 0 then
--子分区不存在的处理
vv_task_pos := '子分区 '||vv_subpartition_name||' 不存在,增加该子分区';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 4, vv_task_pos, null);
vv_sql := 'alter table '||vv_table_owner||'.'||vv_table_name||' modify partition '
||vv_partition_name||' add subpartition '||vv_subpartition_name||' values('
||case when vv_value_type='INTEGER' then ''||vi_values||''
when vv_value_type='CHAR' then ''''||vi_values||''''
when vv_value_type='DATE' then 'to_date('||vi_values||',''yyyymmdd'')' end||') tablespace '
||vv_tablespace;
execute immediate vv_sql;
else
--子分区存在的处理
vv_task_pos := '子分区 '||vv_subpartition_name||' 存在,清空此分区';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 4, vv_task_pos, null);
vv_sql := 'alter table '||vv_table_owner||'.'||vv_table_name||' truncate subpartition '
||vv_subpartition_name;
execute immediate vv_sql;
end if;
end if;
end if;
vv_task_pos := '完成!';
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 0, vv_task_pos, null);
return(vi_result);
/*EXCEPTION
WHEN exc_error then
vi_result:=0;
WHEN OTHERS THEN
vi_result := masamk.sf_write_proc_log(vv_task_name, vv_table_name, sysdate, 0, sqlcode, sqlerrm);
return(vi_result);*/
END fun_add_table_partitions;