はじめに
SQLを実行したときに、次のようなエラーに遭遇したことはありませんか?
ORA-00972: 識別子が長すぎます
私は初めて見たとき、
- 識別子って何?
- SQLのどこが長いの?
- どう直せばいいの?
と混乱しました。
調べてみると、Oracleには「名前の長さ」に関するルールがあり、それに違反するとこのエラーが発生することが分かりました。
この記事では、ORA-00972の原因と対処方法を簡単にまとめます。
識別子とは?
まず「識別子」という言葉から整理します。
識別子とは、データベースの中で名前として扱われるものです。
例えば次のようなものが識別子です。
- テーブル名
- カラム名
- ビュー名
- エイリアス(別名)
例:
SELECT
name AS user_name
FROM users;
このSQLでは、
| 名前 | 種類 |
|---|---|
| users | テーブル名 |
| name | カラム名 |
| user_name | エイリアス |
これらはすべて識別子として扱われます。
ORA-00972が発生する理由
Oracleでは識別子の長さに制限があります。
その制限を超える名前を付けると、
ORA-00972: 識別子が長すぎます
が発生します。
例えば次のようなSQLです。
SELECT
COUNT(*) AS THIS_IS_A_VERY_LONG_COLUMN_ALIAS_NAME
FROM users;
環境によっては、このような長いエイリアス名が原因でエラーになることがあります。
エイリアスとは?
エイリアスとは「別名」です。
例えば
SELECT
COUNT(*) AS CNT
FROM users;
なら、
計算結果に
CNT
という名前を付けています。
以前の記事で紹介した
FROM users u
の
u
もエイリアスでした。
Oracleはこのエイリアスも識別子として扱います。
どう直せばいい?
最も簡単な対処方法は、
名前を短くすることです。
例えば
SELECT
COUNT(*) AS CNT_ALL,
MIN(price) AS MIN_VAL,
MAX(price) AS MAX_VAL,
AVG(price) AS AVG_VAL
FROM products;
のように略語を使うと分かりやすくなります。
命名ルール(例)
私が実務や学習で意識しているのは次の3点です。
① エイリアス名は短めにする
CNT
MAX_VAL
AVG_VAL
程度でも十分意味は伝わります。
② 長い説明はコメントに書く
COUNT(*) AS CNT_ALL -- 全件数
のようにすると読みやすくなります。
③ 一貫したルールを使う
例えば
COUNT → CNT
MIN → MIN
MAX → MAX
AVERAGE → AVG
など、自分の中でルールを決めるとSQLが読みやすくなります。
まとめ
今回学んだことをまとめます。
- ORA-00972は「名前が長すぎる」ときに発生するエラー
- 識別子にはテーブル名・カラム名・エイリアス名などが含まれる
- エイリアスも長すぎるとエラーの原因になる
- 名前は短く分かりやすく付ける
- 詳しい説明はコメントで補足する
私は最初、「識別子」という言葉自体が分からず混乱しました。
しかし、
識別子 = データベース上の名前
と理解すると、エラーの原因が追いやすくなりました。
同じエラーに遭遇した方の参考になれば幸いです。
