[Oracle] マウント状態の時に動的パフォーマンスビューを参照してORA-01219エラー | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Oracle9iR2でデータベースがマウント状態の時に、複数の動的パフォーマンスビューを結合する問い合わせを実行すると、以下のようなエラーに遭遇しました。
ORA-01219: データベースがオープンしていません: 固定の表/ビューに対する問合せのみ可能です


この時問い合わせたビューはいずれもマウント状態で参照できるビューなのですが...?



実行したのは以下のようなSQL。

COL FILE# FORMAT 999
COL FILE_NAME FORMAT A36
COL TABLE_SPACE_NAME FORMAT A10
COL STATUS FORMAT A7
COL ERROR FORMAT A16
SELECT RF.FILE#, DF.NAME FILE_NAME, TS.NAME TABLE_SPACE_NAME, DF.STATUS, RF.ERROR, RF.CHANGE#, RF.TIME
  FROM V$RECOVER_FILE RF
  INNER JOIN V$DATAFILE DF ON DF.FILE# = RF.FILE#
  INNER JOIN V$TABLESPACE TS ON TS.TS# = DF.TS#
/


リカバリが必要なデータ・ファイルを取得するSQLなのですが、データ・ファイル名と表領域名も同時に取得するために、V$RECOVER_FILE、V$DATAFILE、V$TABLESPACEの3つのビューを内部結合しています。


SQLとしては正しく、データベースをオープンした状態ではエラーにならないのですが、なぜかマウント状態ではエラーとなってしまいます。

ところが、以下のように結合部分を旧来の文法で書き直すと、マウント状態でも正常に結果が返ってきます。

COL FILE# FORMAT 999
COL FILE_NAME FORMAT A36
COL TABLE_SPACE_NAME FORMAT A10
COL STATUS FORMAT A7
COL ERROR FORMAT A16
SELECT RF.FILE#, DF.NAME FILE_NAME, TS.NAME TABLE_SPACE_NAME, DF.STATUS, RF.ERROR, RF.CHANGE#, RF.TIME
  FROM V$RECOVER_FILE RF, V$DATAFILE DF, V$TABLESPACE TS
  WHERE DF.FILE# = RF.FILE#
    AND TS.TS# = DF.TS#
/

マウント状態では"INNER JOIN"は使えないという"仕様?"なのでしょうか?