这不是很简单;主要障碍是user_tab_partitions.high_value 数据类型,即long,很难使用。通常你会得到
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.
user_tab_partitions 说什么?
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 列中提取date 部分。第一步有点愚蠢——创建一个新表;基本上是 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.
为简单起见(在进一步的步骤中),我将基于该表创建一个视图,该视图将提取 date 值(第 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>
好的,您将使用两个date 参数,然后在最终查询中导致between,但这很容易修改。
这里的主要缺点是创建temp_utp 表的CTAS;您必须像在主表中添加新分区一样频繁地重新创建它。一种选择是以预定的方式进行,例如使用数据库作业(如果您不知道如何操作,请参阅dbms_job 和/或dbms_scheduler 文档),这将安排一个存储过程,然后使用动态SQL,即execute immediate 创建temp_utp。您不必重新创建视图 - 只要创建了新的 temp_utp 表,它就会生效。