【Oracle】ビューの情報を取得する方法|USER/ALL/DBA_VIEWS・定義確認・依存関係・無効ビュー対処まで完全解説

Oracleデータベースでビューの定義・所有者・依存関係・コンパイルエラーを調べるには、データディクショナリビューを使います。本記事ではUSER_VIEWS / ALL_VIEWS / DBA_VIEWSの使い分けから、無効ビューの特定・再コンパイルまでを体系的に解説します。

スポンサーリンク

USER_VIEWS / ALL_VIEWS / DBA_VIEWS の違い

Oracleはビュー情報を3段階のデータディクショナリビューで管理しています。

ビュー名 参照できる範囲 必要権限 OWNER列
USER_VIEWS 自分が所有するビューのみ なし(一般ユーザー可) なし(自分固定)
ALL_VIEWS アクセス権のある全ビュー なし(一般ユーザー可) あり
DBA_VIEWS DB内の全ビュー DBA権限または SELECT ANY DICTIONARY あり
使い分けの基本: 開発・確認作業なら USER_VIEWS、他スキーマのビューも調べたい場合は ALL_VIEWS、DB全体を管理・監査する場合は DBA_VIEWS を使います。

主な列の説明

列名 データ型 内容
OWNER VARCHAR2 ビューの所有者スキーマ名(ALL/DBAのみ)
VIEW_NAME VARCHAR2 ビュー名
TEXT_LENGTH NUMBER ビュー定義テキストの文字数
TEXT LONG ビューの定義SQL(SELECT文)
TEXT_VC VARCHAR2 ビュー定義(VARCHAR2型、12.2以降)
TYPE_TEXT VARCHAR2 オブジェクトビューの型情報
OID_TEXT VARCHAR2 OIDのWITH句
READ_ONLY VARCHAR2 読み取り専用かどうか(Y/N)

ビューの一覧を取得する

自分が所有するビューを一覧表示

SQL — USER_VIEWS でビュー一覧を取得
SELECT view_name,
       text_length,
       read_only
  FROM user_views
 ORDER BY view_name;

特定スキーマのビューを検索(ALL_VIEWS)

SQL — ALL_VIEWS でスキーマを指定して検索
-- 特定スキーマのビューを一覧表示
SELECT owner, view_name, text_length, read_only
  FROM all_views
 WHERE owner = 'HR'
 ORDER BY view_name;

-- 名前にキーワードを含むビューを検索
SELECT owner, view_name
  FROM all_views
 WHERE view_name LIKE '%EMP%'
 ORDER BY owner, view_name;

ビューの定義(SQL文)を確認する

TEXT列はLONG型のため、DBMS_METADATAを使うとより扱いやすい形式で取得できます。

TEXT列で定義を確認(SQL*Plus / SQLcl)

SQL — ビュー定義テキストを取得
-- TEXT列(LONG型)で取得(SQL*Plus では SET LONG 10000 推奨)
SELECT text
  FROM user_views
 WHERE view_name = 'EMP_DEPT_VIEW';

-- Oracle 12.2以降: TEXT_VC(VARCHAR2型)で取得(JOIN等も可能)
SELECT view_name, text_vc
  FROM user_views
 WHERE view_name = 'EMP_DEPT_VIEW';

DBMS_METADATA で DDL 形式(CREATE VIEW 文)を取得

SQL — DBMS_METADATA.GET_DDL でCREATE VIEW文を取得
-- 自スキーマのビューのDDLを取得
SELECT DBMS_METADATA.GET_DDL('VIEW', 'EMP_DEPT_VIEW') AS ddl
  FROM dual;

-- 他スキーマのビューのDDLを取得(DBA権限が必要)
SELECT DBMS_METADATA.GET_DDL('VIEW', 'EMP_DEPT_VIEW', 'HR') AS ddl
  FROM dual;

ビューのオブジェクト情報を確認する

ALL_OBJECTSと組み合わせることで、ビューの作成日時・最終DDL日時・状態(VALID/INVALID)を取得できます。

SQL — ALL_OBJECTS でビューの作成日時・状態を確認
SELECT owner,
       object_name AS view_name,
       created,
       last_ddl_time,
       status
  FROM all_objects
 WHERE object_type = 'VIEW'
   AND owner = 'HR'
 ORDER BY object_name;

ビューの依存関係を確認する

ビューが参照しているテーブル・他ビューの依存関係は ALL_DEPENDENCIES で確認できます。

SQL — ALL_DEPENDENCIES でビューの依存関係を確認
-- ビューが依存しているオブジェクト(ビューが参照するテーブル・ビューなど)
SELECT name       AS view_name,
       referenced_owner,
       referenced_name,
       referenced_type
  FROM all_dependencies
 WHERE owner = 'HR'
   AND type  = 'VIEW'
   AND name  = 'EMP_DEPT_VIEW'
 ORDER BY referenced_type, referenced_name;

-- 逆引き: 特定テーブルに依存するビューを検索
SELECT owner, name AS view_name
  FROM all_dependencies
 WHERE referenced_owner = 'HR'
   AND referenced_name  = 'EMPLOYEES'
   AND type = 'VIEW'
 ORDER BY owner, name;

無効(INVALID)ビューを特定する

参照先テーブルの変更などによりビューが無効化(INVALID)されることがあります。以下のクエリで一覧できます。

SQL — 無効なビューを一覧取得
-- 自スキーマの無効ビューを確認
SELECT object_name AS view_name,
       status,
       last_ddl_time
  FROM user_objects
 WHERE object_type = 'VIEW'
   AND status = 'INVALID'
 ORDER BY object_name;

-- DB全体の無効ビュー(DBA権限が必要)
SELECT owner, object_name AS view_name, last_ddl_time
  FROM dba_objects
 WHERE object_type = 'VIEW'
   AND status = 'INVALID'
 ORDER BY owner, object_name;

無効ビューのコンパイルエラーを確認する

SQL — USER_ERRORS でコンパイルエラーの詳細を確認
SELECT name, line, position, text AS error_message
  FROM user_errors
 WHERE type = 'VIEW'
   AND name = 'EMP_DEPT_VIEW'
 ORDER BY sequence;

-- SQL*Plus では SHOW ERRORS VIEW ビュー名 でも確認できる

無効ビューを再コンパイルする

SQL — ALTER VIEW COMPILE で再コンパイル
-- 個別に再コンパイル
ALTER VIEW emp_dept_view COMPILE;

-- スキーマ内の全無効ビューを一括再コンパイル
BEGIN
  FOR v IN (
    SELECT object_name FROM user_objects
     WHERE object_type = 'VIEW' AND status = 'INVALID'
  ) LOOP
    EXECUTE IMMEDIATE 'ALTER VIEW ' || v.object_name || ' COMPILE';
  END LOOP;
END;
注意: 再コンパイルしてもINVALIDのままの場合は、参照先テーブルが削除・変更されている可能性があります。USER_ERRORSでエラー内容を確認し、ビュー定義を修正してください。

ビューの列情報を確認する

SQL — ALL_TAB_COLUMNS でビューの列を確認
SELECT column_name,
       data_type,
       data_length,
       nullable
  FROM all_tab_columns
 WHERE owner = 'HR'
   AND   table_name = 'EMP_DEPT_VIEW'
 ORDER BY column_id;

ビューのコメントを確認・設定する

SQL — ビューコメントの設定と確認
-- ビューにコメントを設定
COMMENT ON TABLE emp_dept_view IS '社員と部門を結合したビュー';

-- ビューのコメントを確認
SELECT table_name, comments
  FROM all_tab_comments
 WHERE owner      = 'HR'
   AND   table_name = 'EMP_DEPT_VIEW';

まとめ

確認したい内容 使用するビュー 主要列
ビューの一覧・定義テキスト USER/ALL/DBA_VIEWS VIEW_NAME, TEXT
CREATE VIEW 形式で定義取得 DBMS_METADATA.GET_DDL
作成日時・状態(VALID/INVALID) ALL_OBJECTS CREATED, STATUS
参照先テーブル・ビューの依存関係 ALL_DEPENDENCIES REFERENCED_NAME
コンパイルエラーの詳細 USER_ERRORS TEXT, LINE
ビューの列情報 ALL_TAB_COLUMNS COLUMN_NAME, DATA_TYPE
よくある質問(FAQ)

Q. USER_VIEWS と ALL_VIEWS どちらを使えばよいか?
A. 自分のスキーマのビューだけ確認するなら USER_VIEWS、他スキーマのビューも参照したい場合は ALL_VIEWS を使います。DBA作業では DBA_VIEWS が最も広い範囲を網羅します。

Q. TEXT列がLONG型で扱いにくい場合はどうすればよいか?
A. Oracle 12.2以降では TEXT_VC(VARCHAR2型)列が追加されており、WHERE条件やSUBSTR等が使えます。旧バージョンでは DBMS_METADATA.GET_DDL を使うと CLOB 形式で取得でき、より操作しやすくなります。

Q. テーブルを変更したらビューがINVALIDになった。どう対処すればよいか?
A. まず USER_ERRORS でエラー内容を確認します。列の削除・型変更が原因の場合はビュー定義を修正し CREATE OR REPLACE VIEW で再作成します。列の追加のみなら ALTER VIEW ビュー名 COMPILE で再コンパイルするだけで解決することが多いです。