Oracle 11g迁12c后物化视图FORCE刷新报ORA-12008等错误咨询
根因定位
这是Oracle 12.1.0.2版本的已知Bug,触发场景完全匹配你遇到的现象:
- 首次刷新为全量刷新,FORCE刷新无增量数据时默认走全量流程,解析的是你编写的原生SQL,本身语法正确所以执行成功;
- 基表有新增数据后,FORCE刷新会尝试走快速刷新流程,Oracle会自动生成内部增量同步SQL,此时你代码的两个特征触发Bug:
- 物化视图定义中存在带双引号、包含空格的列别名(
"DATE TRT") - 物化视图定义包含行内
--注释,快速刷新的SQL生成逻辑无法正确解析注释位置,拼接出的SQL缺失FROM关键字,触发ORA-00923报错
对应官方Bug编号为19176485,仅影响12.1.0.2版本,11g无此问题。
- 物化视图定义中存在带双引号、包含空格的列别名(
验证方法
你可以通过跟踪刷新过程获取Oracle生成的错误SQL确认问题:
-- 开启10046跟踪 ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'; -- 尝试快速刷新 BEGIN DBMS_MVIEW.REFRESH(LIST => 'HEW.MV_EUC_MVT_ADM_MULTI', METHOD => 'F'); END; / -- 关闭跟踪 ALTER SESSION SET EVENTS '10046 trace name context off';
执行后到数据库UDUMP目录下取当前会话对应的trace文件,即可看到生成的错误SQL语法。
解决方案
永久解决方案
安装Oracle 12.1.0.2最新的PSU补丁集,补丁中已包含Bug 19176485的修复,安装后无需调整现有物化视图定义即可正常运行。
临时规避方案(无需打补丁)
按如下规则调整物化视图定义即可解决问题:
- 移除所有行内
--注释,所有注释统一放在SQL开头的/* */块中 - 把带空格的双引号列别名改成无特殊字符的非引号别名,例如把
"DATE TRT"改为DATE_TRT,同步修改物化视图头部的列定义列表 - 可选:将物化视图日志的
EXCLUDING NEW VALUES改为INCLUDING NEW VALUES,避免多表关联快速刷新的其他潜在解析问题
调整后重建物化视图即可正常执行快速刷新。
内容的提问来源于stack exchange,提问作者mradul
相关产品推荐
相关产品推荐

