用于表空间和表分区的方法

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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值