本文详细描述了在BITMAP索引的表上,进行merge时,出现错误。但是update不会出现错误。
1、版本信息:
select * from v$version;
2、建表语句:
CREATE TABLE A02
(C1 NUMBER primary key
,C2 VARCHAR(10)
,C3 DATE
);
3、常规的merge语句
MERGE INTO A02 using (SELECT 11 C1,'11' C2,SYSDATE C3 FROM DUAL) B
ON(A02.C1=B.C1)
when matched then update set A02.C2=B.C2,A02.C3=SYSDATE
when not matched then INSERT(C1,C2,C3) values(B.C1,B.C2,B.C3);
commit;
select * from A02;
以上语句正常执行,插入一行。
4、创建BITMAP索引。
create bitmap index bidx_a02 on A02(C2);
5、再次运行上面的语句。
MERGE INTO A02 using (SELECT 11 C1,'11' C2,SYSDATE C3 FROM DUAL) B
ON(A02.C1=B.C1)
when matched then update set A02.C2=B.C2,A02.C3=SYSDATE
when not matched then INSERT(C1,C2,C3) values(B.C1,B.C2,B.C3);
commit;
出现如下错误提示
MERGE INTO A02
using (SELECT 11 C1,'11' C2,SYSDATE C3 FROM DUAL) B
ON(A02.C1=B.C1)
when matched then update set A02.C2=B.C2,A02.C3=SYSDATE
when not matched then
INSERT(C1,C2,C3) values(B.C1,B.C2,B.C3);
执行失败(语句1)
多版本操作冲突过多
1条语句执行失败
6、删除BITMAP索引
drop index bidx_a02;
7、再次运行MERGE语句,成功。
MERGE INTO A02 using (SELECT 11 C1,'11' C2,SYSDATE C3 FROM DUAL) B
ON(A02.C1=B.C1)
when matched then update set A02.C2=B.C2,A02.C3=SYSDATE
when not matched then INSERT(C1,C2,C3) values(B.C1,B.C2,B.C3);
commit;
select * from A02;
8、单独运行UPDATE语句更新带有BITMAP索引的表,不会出现错误。
UPDATE A02 SET C2='1144',C3=SYSDATE-2 WHERE C1=11;
commit;
select * from A02;
分享结束。
文章
阅读量
获赞