`

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

SQL 
阅读更多
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;

 

分享到:
评论

相关推荐

    关于oracle的表空间,分区表,以及索引的总结

    Oracle的表空间、分区表及索引是数据库管理和性能优化的关键组成部分。通过合理设计和有效管理这些组件,可以确保数据库系统的高效运行和数据的安全存储。理解它们的原理和使用方法,对于任何Oracle数据库管理员来说...

    Oracle表分区 建表空间 创建用户

    范围分区是根据一个特定的范围值来分割表的一种方法,通常用于时间戳或者日期字段。示例SQL如下: ```sql CREATE TABLE SALES ( PRODUCT_ID NUMBER(2) PRIMARY KEY, SALE_DATE DATE NOT NULL, SALE_COST FLOAT )...

    ORALCE表空间 创建命令 分区表 分区索引

    本篇将深入探讨Oracle表空间的创建命令,以及如何创建分区表和分区索引,这些都是管理大规模数据库的关键技术。 首先,我们来看Oracle表空间的创建命令。在Oracle中,表空间是用来存储数据库对象的空间,由一个或多...

    BLOG_如何将一个普通表转换为分区表.pdf

    DBMS_REDEFINITION方法是Oracle提供的一个工具包,用于在不锁定原表的情况下,将非分区表在线转换为分区表。通过DBMS_REDEFINITION包中的步骤和函数,可以实现分区表的在线重定义,这种方式对系统影响最小,但需要...

    过程时间记录和分区表相关

    总的来说,过程时间记录和分区表是Oracle数据库管理中的重要工具,前者用于诊断和优化存储过程的执行效率,后者则是处理大数据量和提升查询性能的有效手段。在日常工作中,合理运用这两项技术,可以显著提高数据库...

    Oracle表分区详解(优缺点)

    本文将详细介绍Oracle表分区的概念、作用、优缺点,以及各种类型的分区和操作方法。 首先,理解表空间和分区表的概念至关重要。表空间是Oracle数据库中存储数据的基本单位,它由一个或多个数据文件组成,容纳了...

    海思MTD分区表

    海思MTD分区表是针对海思半导体的HI3516C芯片设计的一种存储分区配置,主要用于管理和组织嵌入式设备的非易失性存储器(NAND Flash)。MTD,即Memory Technology Device,是Linux系统中用于驱动各种非易失性存储设备...

    Oracle分区表详解

    Oracle 的分区技术是一种用于管理和优化超大型表和索引的有效手段。通过将一个大型的表或者索引分割成多个较小且可管理的部分,分区技术能够显著提升数据库的性能、可用性和可维护性。 ##### 分区的作用: 1. **...

    Oracle 分区表自动维护脚本

    1. 创建基础表`PART_T_MAINTENANCE`,用于记录需要维护的分区表的相关信息,如表拥有者、表名、分区名、表空间名和时间段等。这里还指定了表空间为`DMS_DEV_DAT`。 2. 插入分区表信息到基础表`PART_T_MAINTENANCE`...

    Oracle分区表用法

    分区表将逻辑上完整的表在物理上分割成多个部分,称为分区,每个分区存储在不同的表空间中。这样,查询时只需要扫描相关的分区,而不是整个表,从而提高查询速度。 2. **表分区的具体作用** - 性能提升:通过限制...

    oracle创建分区表.pdf

    5. 分区表的扩容:随着时间推移,数据量增加,需要为分区表添加新的分区和表空间。本案例在2001年第三季度建立了一个新的表空间,并为表添加了新的分区。新分区的创建需要指定分区的名称、范围以及对应的表空间。 ...

    深入学习分区表及分区索引(详解oracle分区).docx

    - 物理属性可以不同,如PCTFREE(预留空间百分比)、PCTUSED(使用空间百分比)和表空间分配。 - 分区独立性保证即使部分分区不可用,其他分区仍可正常工作。 - 最大分区数量为64000,但LONG或LONG RAW列的表不...

    sqlServer数据库大表分区方案

    ### SQL Server 大表分区...通过合理的分区设计,可以显著提高数据库的查询和更新性能,尤其是在面对千万级别的大表时。在实际应用中,还需要根据具体业务需求和技术环境来调整分区策略,以达到最佳的性能优化效果。

    oracle定时删除表空间的数据并释放表空间

    7. **表分区和段压缩**:为了更有效地管理表空间,可以考虑对大表进行分区,根据日期或其他业务关键字段将数据分段存储。此外,Oracle还提供了压缩选项,如ROW STORE COMPRESSION和COLUMN STORE COMPRESSION,可以在...

    windows操作系统分区表

    1. **MBR分区表**:MBR分区表通常用于最多四个主分区或三个主分区加一个扩展分区的硬盘。MBR包含一个引导扇区,用于启动计算机,以及一个分区表,其中列出所有分区的信息。每个分区条目占用16个字节,限制了最多只能...

    oracle表分区详细讲解

    #### 四、表分区的类型及操作方法 1. **范围分区**:最常用的分区类型之一,根据分区键的范围将数据映射到各个分区。通常使用日期作为分区键。 - **创建示例**: ```sql CREATE TABLE CUSTOMER ( CUSTOMER_ID ...

    oracle表空间,分区表,索引.pdf

    Oracle支持多种分区类型,包括范围分区和列表分区。范围分区是根据列值的范围进行划分,适用于连续且有明显分界的数据,如日期或编号。而列表分区则适用于列值有限且已知的场景,可以明确指定哪些值属于哪个分区。 ...

    SQL2008分区表的建立

    SQL Server 分区表的建立和操作 SQL Server 分区表是一种高效的数据存储方式,能够帮助用户更好地管理和优化大量数据。分区表可以将大型表拆分成多个小的、独立的逻辑部分,从而提高数据的可访问性和可管理性。本文...

    oracle自动建立表分区脚本

    Oracle支持多种分区类型,包括范围分区、列表分区、散列分区和复合分区等。 2. **范围分区**:根据指定的列值范围划分分区,例如按照日期创建月度或季度分区。这种分区方式适用于历史数据归档,便于按时间区间查询...

    MySQL分区表自动创建及删除存储过程

    总的来说,这个压缩包提供了一套完整的解决方案,用于自动管理MySQL的分区表。通过存储过程和事件调度器,可以实现分区的动态创建和删除,从而减轻数据库管理员的维护负担,同时保持数据库性能的高效。正确理解和...

Global site tag (gtag.js) - Google Analytics