在oracle10.2.0.3下,如果设置了cursor_sharing为similar,则可能造成远端数据库物化视图刷新失败……
在oracle10.2.0.3下,如果设置了cursor_sharing为similar,则可能造成远端数据库物化视图刷新失败。
重现一下错误。
会话一:
sql> alter system set cursor_sharing = similar;
系统已更改。
sql> create table t_mv (id number primary key, name varchar2(30));
表已创建。
sql> create materialized view log on t_mv;
实体化视图日志已创建。
会话二:
sql> set sqlp 'sql2> '
sql2> create database link testrac.us.oracle.com
2 connect to test identified by test using 'testrac';
数据库链接已创建。
sql2> create materialized view mv_t_mv refresh fast
2 as select * from t_mv@testrac.us.oracle.com;
实体化视图已创建。
会话一:
sql> insert into t_mv values (1, 'a');
已创建 1 行。
sql> delete t_mv where id = 1;
已删除 1 行。
sql> commit;
提交完成。
会话二:
sql2> exec dbms_mview.refresh('mv_t_mv')
pl/sql 过程已成功完成。
会话一:
sql> insert into t_mv values (2, 'b');
已创建 1 行。
sql> delete t_mv where id = 2;
已删除 1 行。
sql> commit;
提交完成。
会话二:
sql2> exec dbms_mview.refresh('mv_t_mv')
begin dbms_mview.refresh('mv_t_mv'); end;
*第 1 行出现错误:
ora-12008: 实体化视图的刷新路径中存在错误
ora-01008: 并非所有变量都已绑定
ora-02063: 紧接着 line (起自 testrac.us.oracle.com)
ora-06512: 在 "sys.dbms_snapshot", line 2254
ora-06512: 在 "sys.dbms_snapshot", line 2460
ora-06512: 在 "sys.dbms_snapshot", line 2429
ora-06512: 在 line 1
出现这个错误的主要原因是由于设置了cursor_sharing的值等于similar。
查询了一下metalink发现10.2.0.3上和cursor_sharing相关的问题还真不少,具体的描述可以参考:doc id: note:457607.1。这个问题和bug no. 5863277的描述最为接近。
解决问题的最简单的方法就是将cursor_sharing设置为exact,否则需要打5863277的补丁。
oracle将在11g中解决这个bug。