Oracle批量创建分区索引报ORA-00969、ORA-00904错误求解
问题根因
两次报错都是索引字段拼接、索引命名规则不合法导致的:
- 第一次报
ORA-00969: missing ON keyword:组合索引定义里加了横杠-,既导致生成的索引名包含非法字符,又破坏了create index语句的语法结构,SQL解析时无法识别到ON关键字。 - 第二次报
ORA-00904: invalid identifier:组合索引的两个字段直接拼接成了TRX_DATECUSTOMER_ID字符串,Oracle会将其识别为单个不存在的字段;同时配置的trx_time字段不在你给出的表字段列表中,也会触发同类错误。 - 额外隐患:直接用带逗号的字段表达式生成索引名时,逗号属于Oracle命名非法字符,会直接导致语句执行失败。
修正方案
- 组合索引的多个字段之间用英文逗号
,分隔,符合Oracle索引创建语法 - 生成索引名时自动将字段表达式中的逗号替换为下划线,保证索引名合法
- 移除不存在的
trx_time字段配置(如果确实需要给该字段建索引,请先确认表中存在该字段) - 索引用并行重建完成后,关闭索引的并行属性,避免后续业务查询默认启用并行占用过多资源
修正后可直接运行的代码
declare type rtype is table of varchar(100); -- 配置需要建索引的字段,组合索引用逗号分隔字段 cols rtype := rtype('time_stamp', 'trx_date','TRX_DATE,CUSTOMER_ID'); t_name varchar(100) := upper('test'); table_space varchar(100) := 'USERS'; col varchar(100); ix_name varchar(100); begin for j in 1..cols.count loop col := cols(j); -- 替换字段表达式里的逗号为下划线,生成合法索引名 ix_name := replace(col, ',', '_') || '123_ix'; -- 创建本地索引,初始状态设为unusable execute immediate 'create index ' || ix_name || ' ON ' || t_name || '(' || col || ') local unusable'; -- 逐分区重建索引,指定表空间,重建时开2并行提速 for i in (select partition_name from user_tab_partitions where table_name=t_name) loop execute immediate 'alter index ' || ix_name || ' rebuild partition ' || i.partition_name || ' tablespace ' || table_space || ' parallel(degree 2)'; end loop; -- 重建完成后关闭索引并行度,避免影响日常查询 execute immediate 'alter index ' || ix_name || ' noparallel'; end loop; end; /
执行提示:如果你的表数据量很大,重建分区索引时会占用一定IO资源,建议在业务低峰期执行该脚本。
内容的提问来源于stack exchange,提问作者M_Gh
相关产品推荐
相关产品推荐

