Oracle 如何在两个日期(给定日期范围)之间的表上获取日期范围分区名称

Oracle 如何在两个日期(给定日期范围)之间的表上获取日期范围分区名称,oracle,oracle11g,partitioning,Oracle,Oracle11g,Partitioning,我是一个开发者。在我的表中,我有一个日期范围分区。 我想获取为两个日期之间的表定义的分区名称。 我尝试了下面的查询,它返回表上的所有分区 select * from USER_TAB_PARTITIONS WHERE TABLE_NAME = 'TABLE NAME' ORDER BY PARTITION_NAME; 我的要求是,我将传递两个日期作为输入,并在这两个日期之间获取分区名称。 请建议查询。这不是很简单;主要的障碍是用户选项卡分区。高值数据类型,它很长,很难使用。通常你会 ORA-0

我是一个开发者。在我的表中,我有一个日期范围分区。 我想获取为两个日期之间的表定义的分区名称。 我尝试了下面的查询,它返回表上的所有分区

select * from USER_TAB_PARTITIONS WHERE TABLE_NAME = 'TABLE NAME' ORDER BY PARTITION_NAME;
我的要求是,我将传递两个日期作为输入,并在这两个日期之间获取分区名称。
请建议查询。

这不是很简单;主要的障碍是用户选项卡分区。高值数据类型,它很长,很难使用。通常你会

ORA-00932:不一致的数据类型:应为-变长

错误

但是,只需几个步骤,就可以完成。看看这个例子

创建分区表并在其中插入几行:

SQL> CREATE TABLE test_part
  2  (
  3     datum  DATE,
  4     text   VARCHAR2 (10)
  5  )
  6  PARTITION BY RANGE (datum)
  7     INTERVAL ( NUMTODSINTERVAL (1, 'day') )
  8     (PARTITION p0 VALUES LESS THAN (TO_DATE ('01.01.2020', 'dd.mm.yyyy')));

Table created.

SQL> INSERT INTO test_part
  2     SELECT DATE '2015-08-15', 'Little' FROM DUAL
  3     UNION ALL
  4     SELECT DATE '2020-03-26', 'Foot' FROM DUAL;

2 rows created.
用户选项卡分区怎么说

SQL> SELECT table_name, partition_name, high_value
  2    FROM user_tab_partitions
  3   WHERE     table_name = 'TEST_PART';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE
--------------- --------------- -----------------------------------
TEST_PART       P0              TO_DATE(' 2020-01-01 00:00:00', 'SY
                                YYY-MM-DD HH24:MI:SS', 'NLS_CALENDA
                                R=GREGORIA

TEST_PART       SYS_P63         TO_DATE(' 2020-03-27 00:00:00', 'SY
                                YYY-MM-DD HH24:MI:SS', 'NLS_CALENDA
                                R=GREGORIA
因此,您希望从high_value列中提取日期部分。第一步有点愚蠢——创建一个新表;基本上,CTAS:

SQL> CREATE TABLE temp_utp
  2  AS
  3     SELECT table_name, partition_name, TO_LOB (high_value) high_value
  4       FROM user_tab_partitions;

Table created.
为了简化后续步骤,我将基于该表创建一个视图,该表将提取日期值第5行:

SQL> CREATE OR REPLACE VIEW v_utp
  2  AS
  3     SELECT table_name,
  4            partition_name,
  5            TO_DATE (SUBSTR (high_value, 12, 10), 'rrrr-mm-dd') datum
  6       FROM temp_utp;

View created.
剩下的事情现在很简单:

SQL> SELECT *
  2    FROM v_utp
  3   WHERE datum < DATE '2020-02-15';

TABLE_NAME      PARTITION_NAME  DATUM
--------------- --------------- ----------
TEST_PART       P0              2020-01-01

SQL>
好的,您可以使用两个日期参数,这两个参数在最终查询中会导致介于两者之间,但这很容易修改


这里的主要缺点是CTA会创建临时utp表;在向主表中添加新分区时,必须尽可能频繁地重新创建它。一种选择是以计划的方式进行,例如,如果您不知道如何计划存储过程(该存储过程随后将使用动态SQL,即立即执行以创建临时utp),请使用数据库作业查看dbms_作业和/或dbms_调度程序文档。您不必重新创建视图-它将在创建新的临时utp表后立即生效。

对于Oracle来说非常奇怪,好像to\u LOB在开始时不起作用。但你的解决方案是完美的。