Oracle:删除多个分区

时间:2015-08-20 06:26:06

标签: oracle database-partitioning partition

TMP 有5个分区,即P_1,P_2,.... P_5。 我需要删除 TMP 的一些分区;要删除的分区是由另一个查询派生的。

例如:

ALTER TABLE TMP DROP PARTITIONS (SELECT ... From ...  //expression to get partition names )

假设SELECT语句返回P_1& P_5。上面的ALTER语句的部分查询不起作用。有没有办法从SELECT语句中删除带有输入的分区?

5 个答案:

答案 0 :(得分:2)

您可以在dynamic sql阻止中使用anonymous pl/sql;

Begin
  for i in (select part_name from ...  //expression to get partition names) loop
    execute immediate 'ALTER TABLE TMP DROP PARTITION ' || i.part_name;
  end loop;
end;

暂时删除多个分区;

declare
  v_part varchar(1000);
Begin
  select LISTAGG(partition_name, ', ') WITHIN GROUP (ORDER BY partition_name DESC)
  into v_part  
  from ...  //expression to get partition names;
  execute immediate 'ALTER TABLE TMP DROP PARTITION ' || v_part;
end;

答案 1 :(得分:0)

您需要使用动态SQL。这个:

begin
    for prec in (SELECT ... From ...  //expression to get partition names )
    loop
         execute immediate 'ALTER TABLE TMP DROP PARTITION '
             || prec.partition_name;
    end loop;
end;
/

显然,您需要完全相信您的查询将仅返回您要删除的分区。或同等信仰您的备份&恢复计划:)

或者,您可以使用类似的方法生成一个删除脚本,您可以在运行之前查看该脚本。

答案 2 :(得分:0)

您必须使用pl / sql块从具有select查询的表中删除分区。使用listagg制作以逗号分隔的列表。

 DECLARE
    var1 varchar2(50);
    BEGIN
    SELECT listagg(Partition_names) into var1  from table_name//expression to get partition names ;
    execute immediate 'alter table tmp drop PARTITION'||var1  ;
    END;

listagg上的示例

select LISTAGG(partition_name,',') within group(order by table_name) as comma_list
 from ALL_TAB_PARTITIONS where TABLE_owner='OWNER' AND TABLE_NAME='TABLE_NAME'

答案 3 :(得分:0)

也许有人可以帮忙。

此脚本为特定架构删除所有分区表的所有分区。我将它与带有METADATA的透明数据库一起使用,用于更改启动(参考)分区。

ALTER TABLE SCHEMA_1.TABLE_1
  SET INTERVAL ();
ALTER TABLE SCHEMA_1.TABLE_2
  SET INTERVAL ();
ALTER TABLE SCHEMA_1.TABLE_3
  SET INTERVAL ();  

set lines 100

set heading off

spool runme.sql

select 'ALTER TABLE ' || TABLE_OWNER || '.' || TABLE_NAME || ' DROP PARTITION ' || '"' || PARTITION_NAME || '";' from DBA_TAB_PARTITIONS 
where 
    TABLE_OWNER='SCHEMA_1'
--    and TABLE_NAME='TABLE_%' 
    and PARTITION_NAME LIKE 'SYS_P%'
    ;

@runme

ALTER TABLE SCHEMA_1.TABLE_1
  SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'));
ALTER TABLE SCHEMA_1.TABLE_1
  SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'));
ALTER TABLE SCHEMA_1.TABLE_3
  SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'));

是的,脚本是半手动的,但我认为它更安全。

ALTER TABLE ... INTERVAL,需要删除最后一个分区。

时间间隔必须与之前相同

答案 4 :(得分:-1)

您可以使用以下sql生成DML以删除多个表分区。

select 'ALTER TABLE ' || TABLE_OWNER || '.' || TABLE_NAME || ' DROP PARTITION ' || '"' || PARTITION_NAME || '";' from DBA_TAB_PARTITIONS 
where TABLE_NAME='%YOUR_PATTERN%'order by PARTITION_NAME;