• Oracle 存储过程批量删除按日创建分区表的表分区


    批量删除表分区思路:

      1、通过查询 dba_tab_partitions 获取指定日期的表分区名字

      2、alter table tableName drop partition partitionName update global indexes

      注意:

      1、此存储过程适用于按日创建的分区表

    2、创建脚本前执行下面几个命令:
      grant dba to etl;
      grant alter any table to etl;
      grant drop any table to etl;

    create or replace procedure drop_partition(v_schema_name varchar2,v_table_name varchar2,v_start_date varchar2,v_end_date varchar2)
    as
    schema_name varchar2(50):=upper(v_schema_name);
    table_name varchar2(50):=upper(v_table_name);
    start_date varchar2(10):=v_start_date;
    end_date varchar2(10):=v_end_date;
    
    v_sql varchar(200);
    v_partition_name varchar(50);
    
    type refcur_type is ref cursor;
    cur refcur_type;
    
    begin
        execute immediate 'create table tmp_partition_name(partition varchar2(20),drop_date date)';
        execute immediate 'insert into tmp_partition_name
                           select partition,to_date(substr(high_value,instr(high_value,'''''''')+2,10),''yyyy-mm-dd'')-1 from (
                           with xml as (
                           select dbms_xmlgen.getxmltype(''select table_name, partition_name, high_value from dba_tab_partitions where table_owner='''''||schema_name||''''' and table_name='''''||table_name||''''''') as x
                           from dual
                           )
                           select extractValue(rws.object_value, ''/ROW/TABLE_NAME'') table_name,
                           extractValue(rws.object_value, ''/ROW/PARTITION_NAME'') partition,
                           extractValue(rws.object_value, ''/ROW/HIGH_VALUE'') high_value
                           from xml x,
                           table(xmlsequence(extract(x.x, ''/ROWSET/ROW''))) rws ORDER BY extractValue(rws.object_value, ''/ROW/TABLE_NAME''),extractValue(rws.object_value, ''/ROW/HIGH_VALUE'')
                           ) a
                           where to_date(substr(high_value,instr(high_value,'''''''')+2,10),''yyyy-mm-dd'')-1>=to_date('''||start_date||''',''yyyy-mm-dd'')
                           and to_date(substr(high_value,instr(high_value,'''''''')+2,10),''yyyy-mm-dd'')-1<to_date('''||end_date||''',''yyyy-mm-dd'')
                           and partition !=''PART_DFT''';
        open cur for 'select partition from tmp_partition_name order by drop_date asc';
        loop
          fetch cur into v_partition_name;
          exit when cur%notfound;
          v_sql:='alter table '||schema_name||'.'||table_name||' drop partition '||v_partition_name||' update global indexes';
          execute immediate v_sql;
          commit;
          end loop;
        close cur;
        execute immediate 'drop table tmp_partition_name purge';
        
    end drop_partition;

      执行:

      删除 etl.table1 分区表一月份的数据 相当于删除分区字段 timeCol >='2020-01-01' and timeCol < date '2020-02-01' 的数据
      SQL > exec drop_partition('ETL','TABLE1','2020-01-01','2020-02-01');

  • 相关阅读:
    ActiveX控件的注册和反注册
    谷歌浏览器调用activex控件方法
    VC 中的ATL ActiveX 和 MFC ActiveX 有什么区别
    DirectX介绍(转)
    最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)(转)
    统计Visual Studio项目的代码行数
    【Sqlite3】sqlite_sequence表(转)
    linuxunix系统下的字符操作
    tif
    字符串截取
  • 原文地址:https://www.cnblogs.com/smandar/p/13928790.html
Copyright © 2020-2023  润新知