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 で再コンパイルするだけで解決することが多いです。