表 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语句中删除带有输入的分区?
答案 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;