物化視圖重新整理時報0RA-01400的錯誤
背景:物化視圖作為資料倉儲重新整理的三把利器之一,實際的工作中更多的是用於異構平台資料的抽取。今天在建立完成一個物化視圖後,手工進行物化視圖重新整理的時候,報出來ORA-12008和ORA-01400的錯誤,錯誤如下:
問題排查:
1、檢查物化視圖的指令碼,以下是引用相關表的指令碼:
SELECT "BillId",
nvl("Status",null) as "Status",
nvl("ChargeEmp",null) as "ChargeEmp",
"ChargeDate"
FROM dbo.TBILLADJ@ewms; //sqlserver資料//
2、尋找相關的SQLSERVER資料庫的表情況
3、檢查表的內容
4、問題原因:顯然由於ChargeEmp限制為非空的,但是可能由於曆史的原因,早期設定的時候是允許空值的。
但是建立物化視圖的時候,如果沒有特殊說明,物化視圖會根據現有表的情況進行相應的限制;
所以當進行重新整理的時候,資料是不符合當前物化視圖的規範的,因此報ORA-01400的錯誤了。
5、解決方案:
這裡引用了Oracle函數:NVL,具體使用介紹如下:
NULL指的是空值,或者非法值。
NVL (expr1, expr2):expr1為NULL,返回expr2;不為NULL,返回expr1。注意兩者的類型要一致
NVL2 (expr1, expr2, expr3) :expr1不為NULL,返回expr2;為NULL,返回expr3。expr2和expr3類型不同的話,expr3會轉換為expr2的類型
NULLIF (expr1, expr2):相等返回NULL,不等返回expr1
詳細的修改指令碼如下:
SELECT "BillId",
nvl("Status",null) as "Status",
nvl("ChargeEmp",null) as "ChargeEmp",
"ChargeDate"
FROM dbo.TBILLADJ@ewms;
總結:處理問題的過程往往也是學習的過程,且這個學習的速度往往比從書上的學習還快;
附:手工重新整理物化視圖的指令碼:
Begin
Dbms_mView.Refresh('MV_NAME');
End;
物化視圖定義不當引發Oracle效能問題
Oracle物化視圖測試
Oracle【定期重新整理】的【基於串連】的物化視圖
Oracle物化視圖建立報ORA-00942錯誤解決
Oracle 預存程序重新整理物化視圖
Oracle物化視圖的使用