使用Oracle中的分区值从ALL_TAB_PARTITIONS表中获取分区名称

问题描述 投票:0回答:1

我是 Oracle 的新手,数据库中有一个基于日期列的列表分区表。我正在尝试创建一张具有一个静态分区的表,并使用自动关键字使用列名称自动创建下一个分区。下面是我的表 DDL 的语法

CREATE TABLE INSURANCE_PAYMENT 
   (CLAIM_NUMBER VARCHAR2(26 CHAR), 
    CHECK_NUMBER VARCHAR2(20 CHAR), 
    CHECK_DATE TIMESTAMP, 
    PAY_TYPE VARCHAR2(10 CHAR), 
    CHECK_AMOUNT NUMBER(38,2) 
    D_CYCLE_DATE_R DATE
   )
   PARTITION BY LIST (D_CYCLE_DATE_R) AUTOMATIC (
   PARTITION P1 VALUES (TO_DATE('2024-05-29', 'YYYY-MM-DD'))); 

如果查询 ALL_TAB_PARTITIONS 表来检查表的分区列,则会给出以下结果

enter image description here

P1 是静态分区,SYS_P6533 是动态分区,我尝试使用分区值获取分区名称,例如使用以下查询为日期“2024-05-29”创建的 P1 分区

SELECT PARTITION_NAME FROM ALL_TAB_PARTITIONS WHERE TABLE_NAME = 'INSURANCE_PAYMENT' AND HIGH_VALUE = 
TO_NUMBER(TO_CHAR(TO_DATE('2024-05-29', 'YYYY-MM-DD'), 'YYYYMMDDHH24MISS'))

我遇到以下错误

ORA-00997: illegal use of LONG datatype
00997. 00000 -  "illegal use of LONG datatype"
*Cause:    
*Action:
Error at Line: 11 Column: 51

我很困惑它说 HIGH_VALUE 是 long 类型,但插入表中的值看起来很奇怪 "TO_DATE(' 2024-05-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=公历')"。我希望分区列名称根据业务需求截断分区中的数据。

请帮助我如何根据分区值获取分区名称,或者有什么方法可以获取分区名称。如果您需要更多信息,请告诉我。

oracle oracle-sqldeveloper
1个回答
0
投票

我想要分区列名截断分区中的数据

您无法截断分区,但可以删除它。不过你不必知道它的名字,你可以使用

partition for (<values>)

如果您一开始有三个分区,一个手动分区,两个自动分区,并且仅在自动分区中包含数据:

select partition_name, high_value from user_tab_partitions
PARTITION_NAME HIGH_VALUE
P1 TO_DATE(' 2024-05-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=公历')
SYS_P23753 TO_DATE(' 2024-06-26 00:00:00', 'syyyy-mm-dd hh24:mi:ss', 'nls_calendar=公历')
SYS_P23754 TO_DATE(' 2024-07-24 00:00:00', 'syyyy-mm-dd hh24:mi:ss', 'nls_calendar=公历')
select d_cycle_date_r
from insurance_payment
D_CYCLE_DATE_R
24 年 6 月 26 日
24 年 7 月 24 日

然后就可以根据分区值进行查询了:

select d_cycle_date_r
from insurance_payment partition for (date '2024-06-26')
D_CYCLE_DATE_R
24 年 6 月 26 日

您可以用同样的方式删除分区:

alter table insurance_payment
drop partition for (date '2024-06-26')
select d_cycle_date_r
from insurance_payment
D_CYCLE_DATE_R
24 年 7 月 24 日
select partition_name, high_value from user_tab_partitions
PARTITION_NAME HIGH_VALUE
P1 TO_DATE(' 2024-05-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=公历')
SYS_P23754 TO_DATE(' 2024-07-24 00:00:00', 'syyyy-mm-dd hh24:mi:ss', 'nls_calendar=公历')
alter table insurance_payment
drop partition for (date '2024-05-29')
select d_cycle_date_r
from insurance_payment
D_CYCLE_DATE_R
24 年 7 月 24 日
select partition_name, high_value from user_tab_partitions
PARTITION_NAME HIGH_VALUE
SYS_P23754 TO_DATE(' 2024-07-24 00:00:00', 'syyyy-mm-dd hh24:mi:ss', 'nls_calendar=公历')

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.