该字段被定义为 long 类型,因此根据分区方案,它可以保存各种值(像 'ABC' 这样的字符串、数字 123、日期的字符串表示形式等等)。
无论如何,听起来您想从特定分区获取数据,并且您正试图从元数据中找出分区名称。如果是这样,您可以简单地使用分区 for 子句:
select * from my_partitioned_table partition for (to_date('20150801', 'YYYYMMDD'));
这将从包含该特定日期的分区中选择数据(假设您按日期进行分区)。这在间隔分区中特别有用,其中 Oracle 分配像 SYS_xxxx 这样的分区名称,充其量是随意的。
如果您想删除早于给定日期的分区,这有点棘手。上述语法用于选择数据,而不是 DDL(更改表)。为此,您可以执行以下操作(经过松散测试):
创建一个函数来识别哪些分区保存日期小于给定参考日期的数据:
create or replace function fn_partition_is_earlier(i_part_tab_name varchar2, i_partition_position number, i_ref_date in date)
return number
is
l_date_str varchar2(2000);
l_date date;
begin
execute immediate 'select high_value from all_tab_partitions where table_name = :tab and partition_position = :pos'
into l_date_str
using i_part_tab_name, i_partition_position;
execute immediate 'select ' || l_date_str || ' from dual' into l_date;
if (l_date < i_ref_date) then
return 1;
end if;
return 0;
end;
使用函数如下:
with part_name as (
select partition_name
from (
select fn_partition_is_earlier(p.table_name, p.partition_position, to_date('20130501', 'YYYYMMDD')) should_drop_flag, p.*
from all_tab_partitions p
where table_name = 'MY_TAB'
)
where should_drop_flag = 1
)
select 'alter table MY_TAB drop partition ' || part_name.partition_name || ' update global indexes;'
from part_name;
输出将为您提供让 DBA 在下班时间运行的脚本。
希望对您有所帮助。