zoukankan      html  css  js  c++  java
  • 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');

  • 相关阅读:
    Python基础语法 第2节课(数据类型转换、运算符、字符串)
    python基础语法 第5节课 ( if 、 for )
    python基础语法 第4节课 (字典 元组 集合)
    Python基础语法 第3节课 (列表)
    A. Peter and Snow Blower 解析(思維、幾何)
    C. Dima and Salad 解析(思維、DP)
    D. Serval and Rooted Tree (樹狀DP)
    C2. Balanced Removals (Harder) (幾何、思維)
    B. Two Fairs 解析(思維、DFS、組合)
    D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
  • 原文地址:https://www.cnblogs.com/smandar/p/13928790.html
Copyright © 2011-2022 走看看