oracle 11g分区表创建

本文介绍了一个使用Oracle数据库创建按日期范围分区的表的例子。通过两种不同的语法展示了如何定义表及其分区,一种是直接使用日期类型进行分区,另一种是使用字符型日期字符串进行分区。
CREATE TABLE TEST
(
add_DATE DATE
)
PARTITION BY RANGE(add_DATE)
INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITION P01 VALUES LESS THAN(TO_DATE('20160131','YYYYMMDD'))
);

create table TEST
(
add_DATE varchar2(8) not null
)
partition by range (add_DATE )
(
PARTITION P01 VALUES LESS THAN('20160131') tablespace USERS ,
partition P02 VALUES LESS THAN('20160231') tablespace USERS ,
partition P03 VALUES LESS THAN('20160331') tablespace USERS ,
partition P04 VALUES LESS THAN('20160431') tablespace USERS ,
partition P05 VALUES LESS THAN('20160531') tablespace USERS ,
partition P06 VALUES LESS THAN('20160631') tablespace USERS ,
partition P07 VALUES LESS THAN('20160731') tablespace USERS ,
partition P08 VALUES LESS THAN('20160831') tablespace USERS ,
partition P09 VALUES LESS THAN('20160931') tablespace USERS ,
partition P10 VALUES LESS THAN('20161031') tablespace USERS ,
partition P11 VALUES LESS THAN('20161131') tablespace USERS ,
partition P12 VALUES LESS THAN('20161231') tablespace USERS
);
<think>嗯,用户问的是如何在Oracle 11g中查看分区表某个分区的创建日期。首先,我需要回想一下Oracle的数据字典视图,因为这类信息通常存储在那里。常用的视图有DBA_TAB_PARTITIONS、ALL_TAB_PARTITIONS或者USER_TAB_PARTITIONS,具体取决于用户的权限。不过,用户提到的是Oracle 11g,这个版本是否有这些视图呢?我记得这些视图在较早的版本中就存在,所以应该适用。 接下来,分区创建日期可能存储在这些视图的某个字段里。但问题来了,这些视图通常包含分区的高水位线、存储参数等信息,但有没有直接记录分区的创建时间呢?可能需要进一步确认。比如,DBA_OBJECTS视图中有CREATED字段,记录对象的创建时间。分区是否被视为独立的对象呢?在Oracle中,分区可能属于表对象的一部分,所以DBA_OBJECTS中的对象可能只是表本身,而不是每个分区。所以直接查DBA_OBJECTS可能无法得到分区的创建时间。 那有没有其他办法呢?比如,通过审计日志或者DDL触发器?但用户可能没有启用审计,或者没有权限,所以这种方法可能不通用。另外,分区表的统计信息是否有相关的时间信息?比如LAST_ANALYZED,但这个是分析时间,不是创建时间。 突然想到,或许在USER_TAB_PARTITIONS视图中并没有直接存储分区的创建日期,可能需要通过其他方式间接获取。比如,如果分区是通过自动分区管理(比如间隔分区),可能有一些日志或元数据记录。不过,对于手动创建的分区,创建时间可能不会被系统自动记录,除非有触发器。 这时候可能需要告诉用户,Oracle 11g本身不直接存储每个分区的创建时间,但可以通过其他方法间接推断,比如查询DBA_OBJECTS的子对象,或者使用日志挖掘。不过这可能比较复杂。 或者,可能我记错了,某些隐藏的字段或视图中有相关信息。比如,查询DBA_PART_TABLES,但不确定是否有创建时间。或者,检查DBA_SEGMENTS,因为每个分区对应一个段,而段的创建时间可能存储在DBA_SEGMENTS的CREATED字段中?这时候需要验证一下。 假设DBA_SEGMENTS中每个分区的段确实有一个CREATED字段,那么可以通过连接DBA_TAB_PARTITIONS和DBA_SEGMENTS来获取分区的创建时间。例如,通过PARTITION_NAME和SEGMENT_NAME关联,然后获取CREATED字段。这可能是一个可行的方法。 不过,需要注意,分区段的创建时间是否准确反映了分区的创建时间。比如,如果分区被移动或重建,段的创建时间可能会更新,所以可能存在误差。但通常,分区的创建会导致对应段的创建,所以这个时间应该是正确的。 总结一下步骤:首先确定用户是否有权限查询DBA_SEGMENTS和DBA_TAB_PARTITIONS,然后通过连接这两个视图,根据分区名和表名来获取分区的创建时间。同时提醒用户注意可能的误差,并建议使用触发器来记录未来的分区创建时间。</think>在Oracle 11g中,直接查看分区表中某个分区的创建日期并没有内置的系统表或视图记录该信息。但可以通过以下两种方法间接实现: --- ### **方法1:通过数据段创建时间推断(需DBA权限)** 每个分区对应一个独立的物理段(Segment),其创建时间可通过`DBA_SEGMENTS`视图查询: ```sql SELECT segment_name, partition_name, created FROM dba_segments WHERE owner = '表所属用户' AND segment_name = '表名' AND partition_name = '分区名'; ``` #### 注意事项: 1. `created`字段表示段的创建时间,通常与分区创建时间一致 2. 如果分区经过重组(如`ALTER TABLE...MOVE PARTITION`),该时间会被更新 3. 需要`DBA_SEGMENTS`的查询权限 --- ### **方法2:通过DDL触发器记录(推荐未来监控)** 创建系统级触发器记录分区操作: ```sql CREATE OR REPLACE TRIGGER log_partition_operations AFTER CREATE ON DATABASE DECLARE v_sql_text ORA_NAME_LIST_T; v_ddl_text CLOB; BEGIN FOR i IN 1..ORA_SQL_TXT(v_sql_text) LOOP v_ddl_text := v_ddl_text || v_sql_text(i); END LOOP; IF UPPER(v_ddl_text) LIKE '%ADD PARTITION%' THEN INSERT INTO partition_creation_log VALUES (SYSDATE, ORA_DICT_OBJ_OWNER, ORA_DICT_OBJ_NAME, v_ddl_text); END IF; END; / ``` 需预先创建日志表: ```sql CREATE TABLE partition_creation_log ( operation_date DATE, table_owner VARCHAR2(30), table_name VARCHAR2(30), ddl_text CLOB ); ``` --- ### **补充说明** 1. **历史分区无法追溯**:对已存在的分区,只能通过审计日志(若已启用)回溯 2. **时间精度限制**:段创建时间精确到秒级 3. **推荐做法**:重要环境建议启用DDL触发器进行持续监控 示例查询结果输出: ``` SEGMENT_NAME PARTITION_NAME CREATED ------------- --------------- ------------------- SALES_TABLE P_2023_Q1 2023-01-01 09:30:22 ``` 建议根据实际需求选择合适方法,如需精确历史记录,触发器方案更为可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值