Oracle ではテーブルや列にコメント(論理名)を設定でき、データディクショナリビューから取得できます。テーブル定義書の自動生成、設計書との整合性チェック、コメント未設定箇所の検出など、開発・保守の現場で欠かせない機能です。
この記事でわかること
・USER / ALL / DBA_TAB_COMMENTS の違いと使い分け
・USER / ALL / DBA_COL_COMMENTS で列コメントを取得する方法
・COMMENT ON TABLE / COLUMN でコメントを設定・削除する方法
・テーブルコメント + 列コメントを一括取得するクエリ
・コメント未設定のテーブル・列を検出するクエリ
・DBMS_METADATA でコメント DDL を一括出力する方法
・PL/SQL で複数テーブルにコメントを一括設定する方法
・テーブル定義書向けの出力クエリ
・USER / ALL / DBA_TAB_COMMENTS の違いと使い分け
・USER / ALL / DBA_COL_COMMENTS で列コメントを取得する方法
・COMMENT ON TABLE / COLUMN でコメントを設定・削除する方法
・テーブルコメント + 列コメントを一括取得するクエリ
・コメント未設定のテーブル・列を検出するクエリ
・DBMS_METADATA でコメント DDL を一括出力する方法
・PL/SQL で複数テーブルにコメントを一括設定する方法
・テーブル定義書向けの出力クエリ
コメント取得ビューの種類と違い
テーブルコメント用ビュー
| ビュー名 | 参照できる範囲 | 必要権限 | OWNER 列 |
|---|---|---|---|
USER_TAB_COMMENTS |
自スキーマのテーブル・ビュー | なし | なし |
ALL_TAB_COMMENTS |
アクセス権のある全テーブル・ビュー | なし | あり |
DBA_TAB_COMMENTS |
DB 内の全テーブル・ビュー | DBA 権限 | あり |
列コメント用ビュー
| ビュー名 | 参照できる範囲 | 必要権限 | OWNER 列 |
|---|---|---|---|
USER_COL_COMMENTS |
自スキーマのテーブル・ビューの列 | なし | なし |
ALL_COL_COMMENTS |
アクセス権のある全テーブル・ビューの列 | なし | あり |
DBA_COL_COMMENTS |
DB 内の全テーブル・ビューの列 | DBA 権限 | あり |
自分のスキーマだけ確認するなら
USER_ 系(OWNER 列がなくシンプル)、他スキーマも含める場合は ALL_ 系、DBA 権限で DB 全体を対象にするなら DBA_ 系を使い分けます。テーブルコメントを取得する
自スキーマのテーブルコメントを一覧表示
SQL
SELECT table_name,
table_type,
comments
FROM user_tab_comments
WHERE table_type = 'TABLE'
ORDER BY table_name;
特定スキーマ・テーブルのコメントを取得
SQL
-- 特定スキーマのテーブルコメントを一覧表示 SELECT table_name, table_type, comments FROM all_tab_comments WHERE owner = 'HR' AND table_type = 'TABLE' ORDER BY table_name; -- 特定テーブル1件のコメントを取得 SELECT table_name, comments FROM all_tab_comments WHERE owner = 'HR' AND table_name = 'EMPLOYEES';
コメントをキーワードで検索する
SQL
-- コメントに「マスタ」を含むテーブルを検索 SELECT table_name, comments FROM user_tab_comments WHERE comments LIKE '%マスタ%' ORDER BY table_name;
列コメントを取得する
特定テーブルの全列コメントを取得
SQL
SELECT column_name, comments FROM all_col_comments WHERE owner = 'HR' AND table_name = 'EMPLOYEES' ORDER BY column_name;
列の順序(COLUMN_ID)付きで取得する
列コメントビューには列の並び順がないため、ALL_TAB_COLUMNS と結合して COLUMN_ID 順に表示します。
SQL
SELECT ac.column_id,
ac.column_name,
cc.comments
FROM all_tab_columns ac
JOIN all_col_comments cc
ON cc.owner = ac.owner
AND cc.table_name = ac.table_name
AND cc.column_name = ac.column_name
WHERE ac.owner = 'HR'
AND ac.table_name = 'EMPLOYEES'
ORDER BY ac.column_id;
テーブルコメントと列コメントを一括取得する
テーブルの論理名と各列の論理名を 1 クエリで一覧表示するクエリです。テーブル定義の確認に便利です。
SQL
SELECT
tc.table_name,
tc.comments AS table_comment,
ac.column_id,
ac.column_name,
cc.comments AS column_comment
FROM all_tab_comments tc
JOIN all_col_comments cc
ON cc.owner = tc.owner
AND cc.table_name = tc.table_name
JOIN all_tab_columns ac
ON ac.owner = cc.owner
AND ac.table_name = cc.table_name
AND ac.column_name= cc.column_name
WHERE tc.owner = 'HR'
AND tc.table_name = 'EMPLOYEES'
ORDER BY ac.column_id;
複数テーブルを一度に確認したい場合は
WHERE tc.table_name IN ('EMPLOYEES', 'DEPARTMENTS') のように IN 句で指定します。コメントを設定する(COMMENT ON)
テーブルにコメントを設定する
SQL
COMMENT ON TABLE employees IS '社員マスタ';
列にコメントを設定する
SQL
COMMENT ON COLUMN employees.employee_id IS '社員ID'; COMMENT ON COLUMN employees.first_name IS '名'; COMMENT ON COLUMN employees.last_name IS '姓'; COMMENT ON COLUMN employees.hire_date IS '入社日'; COMMENT ON COLUMN employees.salary IS '月額給与(円)';
コメントを削除する
SQL
-- 空文字列を設定するとコメントが削除される(NULL に戻る) COMMENT ON TABLE employees IS ''; COMMENT ON COLUMN employees.salary IS '';
COMMENT ON は DDL 文のため、実行時に自動コミットされます。明示的な COMMIT は不要です。他スキーマのテーブルにコメントを設定する
SQL
-- スキーマ名.テーブル名 で指定 COMMENT ON TABLE hr.employees IS '社員マスタ'; COMMENT ON COLUMN hr.employees.salary IS '月額給与(円)';
他スキーマへのコメント設定には
COMMENT ANY TABLE システム権限が必要です。権限がない場合は ORA-01031: insufficient privileges エラーが発生します。ビュー・マテリアライズドビューへのコメント
COMMENT ON TABLE はビューやマテリアライズドビューにも使用できます。構文はテーブルと同じです。
SQL
-- ビューにコメントを設定 COMMENT ON TABLE v_active_employees IS '在籍社員ビュー'; -- ビューの列にコメントを設定 COMMENT ON COLUMN v_active_employees.full_name IS '氏名(姓+名)'; -- マテリアライズドビューにコメントを設定 COMMENT ON TABLE mv_sales_summary IS '売上集計マテビュー(日次更新)';
USER_TAB_COMMENTS の TABLE_TYPE 列で 'TABLE' / 'VIEW' / 'MATERIALIZED VIEW' を判別できます。コメントが設定されていないテーブル・列を特定する
設計書との整合性確認やコメント漏れの検出に役立つクエリです。
コメント未設定のテーブルを一覧取得
SQL
SELECT table_name, table_type FROM user_tab_comments WHERE (comments IS NULL OR comments = '') AND table_type = 'TABLE' ORDER BY table_name;
コメント未設定の列を一覧取得
SQL
-- 特定テーブルでコメント未設定の列を抽出 SELECT column_name FROM user_col_comments WHERE table_name = 'EMPLOYEES' AND (comments IS NULL OR comments = '') ORDER BY column_name;
スキーマ全体でコメント未設定の列を集計する
SQL
-- テーブルごとにコメント未設定列の件数を集計
SELECT cc.table_name,
COUNT(*) AS no_comment_cols,
(SELECT COUNT(*) FROM user_tab_columns tc
WHERE tc.table_name = cc.table_name) AS total_cols
FROM user_col_comments cc
WHERE (cc.comments IS NULL OR cc.comments = '')
GROUP BY cc.table_name
ORDER BY no_comment_cols DESC;
定期的にこのクエリを実行してコメント設定率を把握しておくと、ドキュメントの品質管理に役立ちます。
DBMS_METADATA でコメント DDL を出力する
DBMS_METADATA.GET_DEPENDENT_DDL を使うと、テーブルに紐づく全コメントを COMMENT ON 文の形式で一括出力できます。環境の移行やバックアップに便利です。
SQL
SELECT DBMS_METADATA.GET_DEPENDENT_DDL(
'COMMENT',
'EMPLOYEES',
'HR'
) AS comment_ddl
FROM dual;
コメントが 1 件も設定されていないテーブルに対して実行すると
ORA-31608: specified object of type COMMENT not found エラーが発生します。事前にコメントの有無を確認してから実行してください。PL/SQL でコメントを一括設定する
大量のテーブル・列にコメントを設定する場合、PL/SQL の動的 SQL が効率的です。
コメント未設定の列に「未設定」マークを付ける
PL/SQL
BEGIN
FOR rec IN (
SELECT table_name, column_name
FROM user_col_comments
WHERE comments IS NULL
) LOOP
EXECUTE IMMEDIATE
'COMMENT ON COLUMN ' || rec.table_name
|| '.' || rec.column_name
|| ' IS ''【要設定】''';
END LOOP;
END;
/
動的 SQL でコメントを一括設定するパターン
PL/SQL
-- テーブルコメントの設定例
BEGIN
EXECUTE IMMEDIATE
q'[COMMENT ON TABLE employees IS '社員マスタ']';
EXECUTE IMMEDIATE
q'[COMMENT ON COLUMN employees.employee_id IS '社員ID']';
EXECUTE IMMEDIATE
q'[COMMENT ON COLUMN employees.first_name IS '名']';
EXECUTE IMMEDIATE
q'[COMMENT ON COLUMN employees.last_name IS '姓']';
EXECUTE IMMEDIATE
q'[COMMENT ON COLUMN employees.hire_date IS '入社日']';
DBMS_OUTPUT.PUT_LINE('コメント設定完了');
END;
/
Oracle の代替クォート構文
q'[...]' を使うと、文字列内のシングルクォートをエスケープせずに記述できます。EXECUTE IMMEDIATE で COMMENT ON 文を実行する際に便利です。テーブル定義書向けの出力クエリ
Excel 等にエクスポートしてテーブル定義書を自動生成する際に使えるクエリです。列の物理名・論理名・型・NULL 可否・デフォルト値を一括出力します。
SQL
SELECT
ac.column_id AS "No.",
ac.column_name AS "物理名",
cc.comments AS "論理名",
ac.data_type
|| CASE
WHEN ac.data_precision IS NOT NULL
THEN '(' || ac.data_precision || ',' || ac.data_scale || ')'
WHEN ac.char_length > 0
THEN '(' || ac.char_length || ')'
ELSE ''
END AS "型・桁",
ac.nullable AS "NULL可否",
ac.data_default AS "デフォルト値"
FROM all_tab_columns ac
JOIN all_col_comments cc
ON cc.owner = ac.owner
AND cc.table_name = ac.table_name
AND cc.column_name = ac.column_name
WHERE ac.owner = 'HR'
AND ac.table_name = 'EMPLOYEES'
ORDER BY ac.column_id;
SQL*Plus や SQL Developer で実行して CSV エクスポートすれば、そのままテーブル定義書のベースとして活用できます。
関連記事
- テーブル一覧を確認する SQL 完全ガイド — USER_TABLES・ALL_TABLES・サイズ・コメント
- テーブルを作成する方法 — CREATE TABLE・全データ型・制約
- インデックス情報を取得する方法 — USER_INDEXES・統計情報
- テーブル名を LIKE 検索して DROP TABLE 文を一括生成
- 容量が大きいテーブルを探す方法 — DBA_SEGMENTS
よくある質問
QUSER_TAB_COMMENTS と ALL_TAB_COMMENTS はどう使い分けますか?
A自分のスキーマ内だけ確認するなら
USER_TAB_COMMENTS(OWNER 列がなくシンプル)。他スキーマのテーブルも含めて検索するなら ALL_TAB_COMMENTS(OWNER 列あり)。DBA 権限で DB 全体を対象にするなら DBA_TAB_COMMENTS を使います。Qコメントを削除するにはどうすればよいですか?
A
COMMENT ON TABLE テーブル名 IS '' のように空文字列を設定すると、コメントが NULL に戻ります。DELETE 文では削除できません。Q他スキーマのテーブルにコメントを設定するには?
A
COMMENT ON TABLE スキーマ名.テーブル名 IS 'コメント' の形式で指定します。COMMENT ANY TABLE システム権限が必要です。DBA 権限があれば自動的に対象になります。QCOMMENT ON は COMMIT が必要ですか?
Aいいえ。
COMMENT ON は DDL 文のため、実行時に自動コミットされます。未コミットの DML(INSERT/UPDATE 等)がある場合は、COMMENT ON の実行時に一緒にコミットされる点に注意してください。QDBMS_METADATA でコメント DDL を出力したら ORA-31608 が出ました。
Aコメントが 1 件も設定されていないテーブルに対して
GET_DEPENDENT_DDL('COMMENT', ...) を実行すると ORA-31608 エラーが発生します。事前に USER_TAB_COMMENTS や USER_COL_COMMENTS でコメントの有無を確認してから実行してください。まとめ
| 目的 | 使用するビュー / コマンド |
|---|---|
| テーブルコメントの取得 | USER / ALL / DBA_TAB_COMMENTS |
| 列コメントの取得 | USER / ALL / DBA_COL_COMMENTS |
| テーブル + 列コメントの一括取得 | TAB_COMMENTS JOIN COL_COMMENTS JOIN TAB_COLUMNS |
| コメントの設定 | COMMENT ON TABLE / COMMENT ON COLUMN |
| コメントの削除 | COMMENT ON ... IS ''(空文字設定) |
| コメント未設定箇所の検出 | WHERE comments IS NULL OR comments = '' |
| コメント DDL の一括出力 | DBMS_METADATA.GET_DEPENDENT_DDL |
| コメントの一括設定 | PL/SQL の EXECUTE IMMEDIATE |
テーブル・列のコメントはデータベースの可読性を大幅に向上させます。開発初期からコメントを設定し、定期的にコメント未設定の検出クエリで漏れをチェックすることで、高品質なデータベース設計を維持できます。

