【问题标题】:oracle select date from partition tableoracle 从分区表中选择日期
【发布时间】:2015-08-11 01:49:58
【问题描述】:

以下语句允许我检索有关表分区的信息:

select table_name, partition_name, high_value from user_tab_partitions where table_name = 'T1';

问题是,由于某种未知原因,high_value 列的值表示为:

TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

是否可以将它们作为日期检索?或者至少对该表达式执行“eval”之类的操作?

【问题讨论】:

  • TO_DATE() 函数返回一个DATE。你有什么问题?
  • to_date 是该列的确切值,我将其作为字符串获取...
  • 这与这个问题有关吗? stackoverflow.com/q/31926904/409172

标签: oracle oracle11g


【解决方案1】:

该字段被定义为 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 在下班时间运行的脚本。

希望对您有所帮助。

【讨论】:

  • 您好,我想要完成的是实际删除早于特定日期的分区......您的声明可以吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 2016-11-17
相关资源
最近更新 更多