Oracle数据库报ORA-14006错误:可查询分区但无法删除分区问题咨询
ORA-14006错误根因
- Oracle DDL语句中的分区名必须为静态标识符,不能直接使用
concat()等函数动态拼接生成,也不能直接嵌套子查询返回分区名,不符合语法规则就会触发无效分区名错误。 - 你手写固定分区名仍然报错的原因是在分区名外多加了多余的括号,
DROP PARTITION语法不需要用括号包裹分区名。
动态生成删分区语句的解决方案
如果需要结合调度工具传入的YYYYMMDD格式参数定时执行,最常用的方案是使用PL/SQL动态执行DDL:
DECLARE -- 调度工具传入的日期参数替换为你实际的变量名,格式为YYYYMMDD v_input_date VARCHAR2(8) := '20211011'; v_partition_name VARCHAR2(30); BEGIN -- 拼接生成分区名 v_partition_name := 'P' || SUBSTR(v_input_date, 1, 6); -- 动态执行删分区DDL,UPDATE INDEXES避免本地主键失效 EXECUTE IMMEDIATE 'ALTER TABLE schema.exampletab DROP PARTITION ' || v_partition_name || ' UPDATE INDEXES'; END; /
如果担心分区名匹配不准,也可以结合系统视图查询确认后再执行,适配Oracle 11g及以上版本:
BEGIN FOR rec IN ( SELECT partition_name FROM all_tab_partitions -- 注意:Oracle系统视图中所有者、表名默认大写存储,建表时没加双引号强制小写的话需要写大写匹配 WHERE table_owner = 'SCHEMA' AND table_name = 'EXAMPLETAB' AND SUBSTR(partition_name, 2, 6) = SUBSTR('${调度工具传入的YYYYMMDD参数}', 1, 6) ) LOOP EXECUTE IMMEDIATE 'ALTER TABLE schema.exampletab DROP PARTITION ' || rec.partition_name || ' UPDATE INDEXES'; END LOOP; END; /
常用分区操作示例
- 静态查询指定分区数据
SELECT * FROM schema.exampletab PARTITION (P202110);
- 按分区键查询(更推荐,无需关心分区名)
-- 替换为你实际的分区键字段即可 SELECT * FROM schema.exampletab WHERE create_time >= DATE '2021-10-01' AND create_time < DATE '2021-11-01';
- 静态删除分区
ALTER TABLE schema.exampletab DROP PARTITION P202110 UPDATE INDEXES;
- 静态截断分区(保留分区结构只删数据)
ALTER TABLE schema.exampletab TRUNCATE PARTITION P202110 UPDATE INDEXES;
内容的提问来源于stack exchange,提问作者Aite97
相关产品推荐
相关产品推荐

