2008年8月20日水曜日

[Oracle]Materialized ViewのCOMPILATION_ERROR

Materialized Viewの問い合わせ文中にINNSER JOIN句による内部結合をすると、Materialized Viewをリフレッシュした際にUSER_MVIEWS表のSTALENESS項目が「COMPILATION_ERROR」となることがこの度判明した。毛穴から2本以上生える毛のメカニズムには及ばないものの、やはり気になる。

で、この「COMPILATION_ERROR」状態のMaterialized Viewを検証してみたところ、リフレッシュ機能自身には問題ない様だが、何らかの潜在的なリスクを内包している恐れがあり、有事の際にOracle社に動作保証しませんとか言われると、もれなく窓の無い部屋で地球防衛軍総司令官になれちゃう。

したがって問い合わせ句を以下の通り修正した。(SQLはイメージ)

----------------------------------------
[修正前]
SELECT EMP_CD
FROM EMP E
INNER JOIN(
SELECT * FROM DEPT
) D
ON E.DEPT_CD = D.DEPT_CD
----------------------------------------
[修正後]
SELECT EMP_CD
FROM(
SELECT E.EMP_CD
FROM EMP E, DEPT D
WHERE E.DEPT_CD = D.DEPT_CD
)
----------------------------------------

いや、何ということは無く、ANSI標準の内部結合からOracle独自の内部結合方式としただけである。
これだけで不思議と「COMPILATION_ERROR」も無くなりきちんと「FRESH」となるだけでなく、REWRITE_CAPABILITY項目も「GENERAL」になるし良いことだらけです。

Oracleの内部結合ではANSI構文が後付けでサポートされたからこうなってるのかなあ。それってどうなのよ。

0 件のコメント: