Oracle:如何根据表数据查询分区信息?ORA-14400错误排查
解决"Inserted partition key does not map to any partition"报错方案
核对分区/子分区定义一致性
直接对比源表和目标表的分区DDL,用以下语句导出表结构:-- 导出源表分区DDL SELECT dbms_metadata.get_ddl('TABLE', 'SOURCE_TABLE', 'SOURCE_SCHEMA') FROM dual; -- 导出目标表分区DDL SELECT dbms_metadata.get_ddl('TABLE', 'TARGET_TABLE', 'TARGET_SCHEMA') FROM dual;重点检查分区键的数据类型、范围边界(范围分区)、枚举值(列表分区)、子分区的嵌套逻辑是否完全一致,哪怕是
DATE和TIMESTAMP这类细微差异都可能导致键值不匹配。校验待插入数据的分区键合法性
针对不同分区类型筛选异常数据:- 列表分区:
SELECT partition_key_column FROM source_table WHERE partition_key_column NOT IN ( SELECT high_value FROM ALL_TAB_PARTITIONS WHERE table_name='TARGET_TABLE' AND table_owner='TARGET_SCHEMA' ); - 范围分区:
SELECT partition_key_column FROM source_table WHERE partition_key_column < ( SELECT MIN(LOW_VALUE) FROM ALL_TAB_PARTITIONS WHERE table_name='TARGET_TABLE' AND table_owner='TARGET_SCHEMA' ) OR partition_key_column > ( SELECT MAX(HIGH_VALUE) FROM ALL_TAB_PARTITIONS WHERE table_name='TARGET_TABLE' AND table_owner='TARGET_SCHEMA' );
若存在超出范围的记录,要么扩展目标表分区(新增范围分区、补全列表枚举值),要么过滤掉不符合规则的数据再插入。
- 列表分区:
排查子分区匹配问题
复合分区场景下,需确认子分区的键值是否属于对应分区的子分区范围。比如按日期分区+地区子分区的表,要检查待插入数据的地区值是否存在于对应日期分区的子分区枚举中,若缺失则需新增子分区。检查分区状态与大小写规则
- 执行以下语句确认分区状态:
避免插入SELECT partition_name, status FROM ALL_TAB_PARTITIONS WHERE table_name='TARGET_TABLE' AND table_owner='TARGET_SCHEMA';READ ONLY或OFFLINE状态的分区。 - 区分大小写的环境中,确保分区键值的大小写与目标表分区定义完全一致(比如字符串类型的分区键
'P_2024'和'p_2024'会被视为不同值)。
- 执行以下语句确认分区状态:
内容的提问来源于stack exchange,提问作者SQL_starter_learner
相关产品推荐
相关产品推荐

