问题描述
我有一个包含分区和子分区的表。我必须首先过滤分区的High_Value(TO_DATE('2020-03-29 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR = GREGORIAN')的结果日期值,然后在结果集中使用Subpartion High值和一些文本值进行过滤,如果条件满足,则删除该子分区。在下面给出代码之前,我已经编写了代码,但是不确定如何继续进行。有人可以帮忙介绍如何声明d_tmp,然后遍历每个子区域并检查
DECLARE
CURSOR get_parts IS
select partition_name,high_value
from ALL_TAB_PARTITIONS
where table_name = 'TempTable';
l_tmp LONG;
d_tmp DATE;
BEGIN
FOR part_rec IN get_parts
LOOP
l_tmp := part_rec.high_value;
EXECUTE IMMEDIATE 'SELECT ' || SUBSTR(l_tmp,1,90) || ' FROM DUAL' INTO d_tmp;
DBMS_OUTPUT.PUT_LINE( to_char(d_tmp,'DD-MM-YYYY'));
END LOOP;
END;
解决方法
大部分时间都在那儿。您只需在该分区的子分区周围循环
DECLARE
CURSOR get_parts IS
select partition_name,high_value
from ALL_TAB_PARTITIONS
where table_name = 'TEMPTABLE';
l_tmp LONG;
d_tmp DATE;
l_tmp2 LONG;
BEGIN
FOR part_rec IN get_parts
LOOP
l_tmp := part_rec.high_value;
EXECUTE IMMEDIATE 'SELECT ' || SUBSTR(l_tmp,1,90) || ' FROM DUAL' INTO d_tmp;
DBMS_OUTPUT.PUT_LINE( to_char(d_tmp,'DD-MM-YYYY'));
for i in (
select subpartition_name,high_value
from ALL_TAB_SUBPARTITIONS
where table_name = 'TEMPTABLE'
and partition_name = get_parts.partition_name
)
loop
l_tmp2 := i.high_value;
--
-- your checks
--
if [checks passed] then
execute immediate 'alter table TEMPTABLE drop subpartition '||i.subpartition_name;
end loop;
END LOOP;
END;