`

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

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;

 

分享到:
评论

相关推荐

    linux机器根分区硬盘LVM扩展方法

    磁盘分区类型:常见的磁盘分区类型包括主分区、扩展分区和逻辑分区。主分区用于引导操作系统或存储数据,而扩展分区允许创建多个逻辑分区。 分区表创建与管理:使用工具如fdisk或parted,可以创建磁盘上的新分区表...

    分区魔术师8.0简体中文版.rar

    安装另一个操作系统,帮助你在计算机上安装另一个操作系统 ,将创建一个用于操作系统的新分区,并确保它有正确的属性来支持该操作系统。调整分区的容量调整一个分区的容量,并让您指定调整容量怎样影响其它同一磁盘...

    论文研究 - 奥里萨邦Mayurbhanj区Bamanghaty分区的水文地貌研究,综合遥感和GIS方法

    印度地形图调查,LISS-III和CARTOSAT DEM卫星图像用于准备各种主题图层,即地质,坡度,线面,排水和地貌,并使用ArcGIS空间分析中的特征到栅格转换工具将其转换为栅格数据,然后我们使用重分类工具对每个栅格地图...

    分区大师PQ10

    它不但可以支持达2TB大小的分区,而且支持对分区、文件夹和文件的压缩,可以更有效地管理磁盘空间。对局域网用户来说,在NTFS分区上可以为共享资源、文件夹以及文件设置访问许可权限,安全性要比FAT 32高得多。所以...

    Gdisk32一键分区工具

    2,当最后分区的剩余空间过小时,该剩余空间将不单独分区,而是合并到前一分区; 3,调整分区容量后,请点击“预览”,即可显示处理后的容量分配,在此界面可无限次调整参数; 4,调整满意后,点击“下一步”,同样...

    傲梅分区助手-用于对电脑硬盘的相关操作

    傲梅分区助手可以对磁盘进行分区,格式化分区等操作 硬盘操作:克隆硬盘,快速分区,擦除硬盘,检查坏扇区,重建MBR,删除所有分区,转换成MBR硬盘,安全擦除固态硬盘等 很多人都遇到过硬盘分区的烦恼问题:新买的...

    Disk Password Protection(加密磁盘和分区)

    分区保护功能允许任何人拥有一个或者若干个用于保存所有机密信息的分区。当保护功能被激活,该分区对于操作系统来说是隐形的,并且被敏感数据占用的空间将被显示为自由磁盘空间。低级保护选项允许用户拦截所有企图...

    分区魔术师 用于磁盘分区的软件

    请下载上面一款全套的分区魔术师 这个单独的是我不慎误传,请勿下载!谢谢

    用于填充android分区的shell脚本

    用于填充android空间的脚本,效率很高,可以达到存储写入的理论值,emmc填充速度都可以达到240MB/S,确认是大M。 用法: adb push fillbigfile.sh /data/local/tmp adb shell sh /data/local/tmp/fillbigfile.sh /...

    华为HS8145X6光猫的分区和地区以及jffs2备份mtd-hs8145x6.7z

    包含机器的主要mtd分区以及完整的jffs2和地区包备份,可用于救砖 制作固件

    模拟可变分区管理方式下最先适用算法实现主存分配与回收程序

    1)模拟可变分区管理方式下最先适用算法实现主存分配与回收程序 2)一个表模拟主存;另一张表用于说明哪些区是空闲的;内容见说明文件 3)运行环境VS2005

    partition分区工具

    一款用于分区的分区工具,方便好用,不用安装的小工具,占用存储空间小

    长城品牌电脑删除隐藏分区工具

    该工具用于产出长城品牌电脑的隐藏分区,不至于硬盘空间流失!

    polypartition:微小的多边形分区和三角剖分库

    多边形分区PolyPartition是一个轻量级的C ++库,用于多边形分区和三角剖分。 PolyPartition为凸分区和三角剖分实现了多种算法。 不同的算法会产生不同的结果质量(并且其复杂度也会相应变化)。 下面概述了已实现的...

    hosvdmatlab代码-Hypergraph-Clustering:MATLAB代码,用于几种基于张量的超图分区和子空间聚类方法

    基于张量的MATLAB代码用于超图分区和子空间聚类的方法 该目录包含与论文[1]相关的所有实现。 这也包括[2,3,4]中提出的方法的实现。 D. Ghoshdastidar和A. Dukkipati。 统一超图分区:可证明的张量方法和采样技术。 ...

    partprobe命令 重读分区表

    partprobe命令用于重读分区表,将磁盘分区表变化信息通知内核,请求操作系统重新加载分区表。如果删除文件后,仍然提示占用空间,可以用partprobe在不重启的情况下重读分区 。 语法格式:partprobe [参数] 常用参数...

    Oracle数据库恢复工具Oracle Database Unloader(ODU)3.09

    列出表的分区和子分区 支持表被truncate后的数据恢复 支持表被drop后的数据恢复 支持压缩表 支持在没有SYSTEM表空间和数据字典损坏的情况下恢复数据,在没有数据字典可用时,ODU能够自动判断数据的类型 支持IOT...

    bsp-tree:构造二叉空间分区树

    bsp-树构造二叉空间分区树。 树是一种二叉树,用于在 n 维空间中对多胞体进行排序和搜索。例子例如,给定XY平面中某处的正方形,我们选择第一个分割,即 BSP 树的根,以在X方向将正方形切成两半。 在每个切片上,...

    libSPDS:用于简单实现空间分区数据结构的 JAVA 库

    库SPDS 用于简单实现空间分区数据结构的 JAVA 库。 包括以下数据结构:

    开拓者ubuntu硬盘安装工具V1.0(xp)

    1.先删除windows下一个分区,用于安装KTZubuntu(不是格式化是直接删除掉)(最好8G以上连续剩余空间) 2.将安装程序和iso文件放入c盘以外的分区根目录,并修改iso文件名为ktzubuntu.iso 3.将iso中.disk和casper解压...

Global site tag (gtag.js) - Google Analytics