oracle-分区表-Drop历史INTERVAL分区PLSQL范例

简介:

Drop历史INTERVAL分区PLSQL范例

--本范例是先drop相关分区,再一次性并行重建不可用的索引

set serveroutput on;
DECLARE
  dt           DATE;
  l_keep_days  NUMBER := 6; --保留时间
  l_table_name VARCHAR2(200) := 'QM20220114'; --要清理的表名
BEGIN

--1. 先drop 分区,不重建索引
 dbms_output.put_line('1.先drop分区,不重建索引');
  FOR x IN (SELECT ut.table_name,
                   ut.partition_name,
                   ut.high_value
              FROM user_tab_partitions ut
             WHERE ut.table_name = l_table_name
              AND INTERVAL = 'YES'
             ORDER BY ut.partition_position)
  LOOP
    EXECUTE IMMEDIATE 'select ' || x.high_value || ' FROM dual'
      INTO dt;
    IF dt < SYSDATE - l_keep_days
    THEN
      dbms_output.put_line(CHR(32)||CHR(32)||CHR(32)|| x.table_name || '.' ||
                           x.partition_name || ' value less then ' ||
                           to_char(dt,'yyyy-mm-dd')||': alter TABLE ' || x.table_name ||' drop PARTITION ' || x.partition_name||';');    
      --下面的EXECUTE IMMEDIATE会drop分区,执行时请慎重确认代码无误   
     EXECUTE IMMEDIATE 'alter TABLE ' || x.table_name ||' drop PARTITION ' || x.partition_name; 
     dbms_output.put_line('--- drop partition Finished ! ' ); 
    END IF;
  END LOOP;
  
--2.重建因drop分区而不可用的全局索引    
  dbms_output.put_line(CHR(10)||'2.重建因drop分区而不可用的全局索引' );  
  FOR y IN (SELECT owner,
       index_name,
       table_name,
       table_owner,
       'alter index ' || owner || '.' || index_name ||
       ' rebuild online parallel 4 tablespace ' || tablespace_name  as rebuild_index_pl ,
       'alter index ' || owner || '.' || index_name ||' noparallel'  as alert_index_no_pl
  FROM dba_indexes where table_name=l_table_name AND partitioned='NO' and  status = 'UNUSABLE' order by index_name
)
 LOOP
  dbms_output.put_line(CHR(32)||CHR(32)||CHR(32)||y.rebuild_index_pl||';');
    dbms_output.put_line(CHR(32)||CHR(32)||CHR(32)||y.alert_index_no_pl||';');
    EXECUTE IMMEDIATE y.rebuild_index_pl;
  EXECUTE IMMEDIATE y.alert_index_no_pl;
  dbms_output.put_line('--- Rebuild Finished !');  

    END LOOP;

--3.重建因drop分区而不可用的分区索引 
  dbms_output.put_line(CHR(10)||'3.重建因drop分区而不可用的分区索引' );     
FOR g IN (SELECT s.index_owner,
       s.index_name,
       'alter index ' || s.index_owner || '.' || s.index_name ||' rebuild partition ' || s.partition_name || ' online parallel 4 TABLESPACE ' ||s.tablespace_name  as rebuild_p_index_pl,
     'alter index ' || s.index_owner || '.' || s.index_name ||' noparallel'  as alert_p_index_no_pl
  FROM dba_ind_partitions s,dba_indexes d where s.index_name=d.index_name and d.table_name = l_table_name and s.status = 'UNUSABLE' order by index_name
)
 LOOP
  dbms_output.put_line(CHR(32)||CHR(32)||CHR(32)||g.rebuild_p_index_pl||';');
    dbms_output.put_line(CHR(32)||CHR(32)||CHR(32)||g.alert_p_index_no_pl||';');
   EXECUTE IMMEDIATE g.rebuild_p_index_pl;
     EXECUTE IMMEDIATE g.alert_p_index_no_pl;
  dbms_output.put_line('--- Rebuild Finished !');  

    END LOOP;  
    
--4.重建因drop分区而不可用的子分区索引   
   dbms_output.put_line(CHR(10)||'4.重建因drop分区而不可用的子分区索引 ' );   
FOR y IN (
SELECT s.index_owner,
       s.index_name,
       'alter index ' || s.index_owner || '.' || s.index_name ||' rebuild subpartition ' || s.subpartition_name || ' TABLESPACE ' ||s.tablespace_name as rebuild_index
  FROM dba_ind_subpartitions s,dba_indexes d
 WHERE  s.index_name =d.index_name and d.table_name = l_table_name and s.status = 'UNUSABLE' order by index_name
  
)
 LOOP
  dbms_output.put_line(CHR(32)||CHR(32)||CHR(32)||y.rebuild_index);
    EXECUTE IMMEDIATE y.rebuild_index;
  dbms_output.put_line('--- Rebuild Finished !');  

    END LOOP;    
           
END;
目录
相关文章
|
6天前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
42 0
|
4天前
|
Kubernetes Oracle 关系型数据库
实时计算 Flink版产品使用合集之是否支持 Oracle 分区表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
14 1
|
6天前
|
Oracle 网络协议 关系型数据库
异地使用PLSQL远程连接访问Oracle数据库【内网穿透】
异地使用PLSQL远程连接访问Oracle数据库【内网穿透】
|
6月前
|
SQL Oracle 关系型数据库
Oracle21C + PLSQL Developer 15 + Oracle客户端21安装配置完整图文版
Oracle21C + PLSQL Developer 15 + Oracle客户端21安装配置完整图文版
164 0
|
6天前
|
Oracle 关系型数据库 Java
plsql链接远程Oracle数据库步骤
实际工作中,我们往往需要使用 PLSQL Develope 工具连接远程服务器上的 ORACLE 数据库进行管理,但是由于 ORACLE 安装在本地电脑步骤繁琐,并且会耗费电脑的很大一部分资源,因此,我们寻求一种不需要在本地安装 ORACLE 数据库而能直接使用 PLSQL Develope 工具连接到远程服务器 ORACLE 的方法。
47 2
|
6天前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
37 0
|
6天前
|
Oracle 关系型数据库 索引
Oracle-维护存在主键的分区表时的注意事项
Oracle-维护存在主键的分区表时的注意事项
77 0
|
6天前
|
SQL Oracle 关系型数据库
Oracle-使用切片删除的方式清理非分区表中的超巨数据
Oracle-使用切片删除的方式清理非分区表中的超巨数据
45 1
|
6天前
|
SQL 存储 Oracle
Oracle-分区表解读
Oracle-分区表解读
123 0
|
6月前
|
消息中间件 Oracle 关系型数据库
Flink CDC确实支持Oracle分区表的CDC
Flink CDC确实支持Oracle分区表的CDC
117 1