ORA-00904
エラーメッセージ
ORA-00904: <文字列>: 無効な識別子です。 ORA-00904: 列名が無効です。 ORA-00904: string: invalid identifier ORA-00904: invalid column name
基本的なエラーの内容
SQLで指定されている列名または文字列が正しく表記されていない場合に発生します。
確認事項および対応
・通常のSQLで発生する場合は列名、文字列、表名などに使用しているシングルクォーテーション、ダブルクォーテーションの対応が正しいか確認する。
・PL/SQL、動的SQLなどでこのエラーが発生する場合は、特にシングルクォーテーション、ダブルクォーテーションの役割としての対応が正しいか確認する。(以下の詳細参照)
・プログラムやツールなどでこのエラーが発生する場合、SQL*Plusで同じSQLをコピーペーストで実施すると*マークから該当箇所が明確になる場合もある。
・エラーが発生しているデータベースでデータベースリンクを使用しており、ORA-904に以下のエラーが伴う場合
ORA-02063: 先行のエラー・メッセージを参照してください <db_link名>。
以下のコマンドをしようすることで回避できる可能性がある。
ALTER SESSION SET EVENTS '10176 TRACE NAME CONTEXT FOREVER, LEVEL 1';
詳細
以下に例を示す
通常のSQLの例
SQL> desc test1 名前 NULL? 型 --------------- -------- ------------------- NO NUMBER(10) NAME VARCHAR2(20)
SQL> select no,name from test1 2 where name = "HOGE"; where name = "HOGE" * 行2でエラーが発生しました。: ORA-00904: "HOGE": 無効な識別子です。 --> シングルクォーテーションをダブルクォーテーションにしてしまっている
SQL> select no,name from test1 2 where nama = 'HOGE'; where nama = 'HOGE' * 行2でエラーが発生しました。: ORA-00904: "NAMA": 無効な識別子です。 --> 列名を間違えている
以下は動的SQLの例
DECLARE v_no NUMBER; v_name VARCHAR2(20); str1 VARCHAR2(10); BEGIN str1 := 'HOGE'; EXECUTE IMMEDIATE 'SELECT t1.no, t1.name FROM test1 t1 WHERE t1.no = 1 AND t1.name = ' || str1 || ''; END; /
上記は 「ORA-00904: "HOGE": 無効な識別子です。」となる
SQLの最後を以下のようにする必要がある
t1.name = ''' || str1 || '''';
最初の3つについて1つめの ' はエスケープ、次はstr1の為の手前シングルクォーテーション、次が「EXECUTE IMMEDIATE 'SELECT...」に対応する文字列の終了。
後ろの4つについて1つめは文字列の開始、2つめはエスケープ、3つ目はstr1の為の後ろシングルクォーテーション、最後が文字列の終了である。
ORA-904は予約語をオブジェクト名に使用した場合にも発生する。
予約語はV_RESERVED_WORDS表のKEYWORD列でで確認可能
SQL> select * from V$RESERVED_WORDS;
KEYWORD LENGTH R R R R D ------------------------------ ---------- - - - - - NOMONITORING 12 N N N N N RECORDS_PER_BLOCK 17 N N N N N CASCADE 7 N N N N N DYNAMIC_SAMPLING 16 N N N N N COLUMN_STATS 12 N N N N N GROUPS 6 N N N N N NO_PX_JOIN_FILTER 17 N N N N N CONSTRAINT 10 N N N N N NO_STATS_GSETS 14 N N N N N SWAP_JOIN_INPUTS 16 N N N N N NOORDER 7 N N N N N TRIGGERS 8 N N N N N : :
関連エラー
ORA-00911: 文字が無効です。
ORA-01756: 引用符付き文字列が正しく終了していません
PLS-00103: 記号""が見つかりました。 次のうちの1つが入るとき: