Oracle LONG类型修改成CLOB类型后,索引失效无法使用

问题产生背景

Oracle数据库中存在一张表A中一个列a,列类型为varchar2类型,代码处理推送文件后将处理数据存入数据库时,由于数据超长导致未将a列数据存入。为解决该问题,将A表中a列修改为CLOB类型,修改后发现A表所以失效,导致系统告警。

下列为修改A表a列类型代码

create tabe A_bak as select * from A;
-- 对改修字段数据进行备份
alter table A add a_bak varchar2(1024);
-- 将修改列数据清空(清原因查看varchar2改成CLOB注意事项)
update A set a_bak = a;
update A set a = null;
--将列类型从varchar2改成CLOB类型
alter table A modify a long;
alter table A modify a CLOB;
-- 恢复数据
update A set a = a_bak;
-- 删除备份列
alter table A drop cloumn a_bak;

脚本执行完成,再次使用索引时数据库返回: 问题: ORA-01502: 索引或这类索引的分区处于不可用状态。分析问题,发现修改完a列的类型后,该表索引失效。

问题产生原因

分析:
查看表索引状态

-- 查看这张表的索引状态  
select index_name, status from user_indexes where table_name='A'; 

-- 查询结果:有两个个索引,其中有两个都失效了。   
-- oracle索引的状态:
-- VALID:当前索引有效
-- N/A :分区索引 有效
-- UNUSABLE:索引失效 
INDEX_NAME                 STATUS
------------------------- --------
SYS_IL0000013716C00001$$   VALID
a_index            UNUSABLE

根据查看表索引状态发现存在两个索引,手动创建的索引已经处于失效状态,另外SYS_IL0000013716C00001$$索引是由修改成CLOB类型时,数据库自动创建的索引。

解决方案

对数据库表中索引进行重建

alter index a_index rebuild;

修改脚本

alter table A add a_bak CLOB;
update A set a_bak = a;
alter table A drop column a;
alter table A rename column a_bak to a;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值