開発時に発生するエラー

ORA-00904:無効な識別子です。

簡単に解決できていないということは、以下の 2つの可能性がある。

原因

識別子を二重引用符(")で囲んで使用している。 多くの開発言語では単一引用符(')と二重引用符(")は同じ意味で使用できるが Oracle では両者は全く意味がことなる。
単一引用符はリテラルをあらわすが、二重引用符(")はオブジェクト名をあらわすので ORA-00904 エラーとなる。
二重引用符(")で囲んだ識別子は大文字小文字を区別する。
引用符で囲んでいない識別子は必ず大文字に変換されて管理されている。

例
 カラム名 "abc" ≠ abc
 カラム名 "日本語a" ≠ "日本語A"
 カラム名 "ABC" = abc

対応

二重引用符(")で囲んだ識別子を使用する場合には、大文字小文字まで正しく記述する。

原因

リテラル項目を単一引用符(')で囲んで使用していない。
動的 SQLを使用する場合にリテラルで指定する項目を文字列として結合するのに単一引用符(')で囲み忘れている事がある。

vVal ;= '代入したいリテラル';
vSQL := 'INSERT INTO ... VALUES (' || vVal ||  ')';

この SQL は、 INSERT INTO ... VALUES (代入したいリテラル) となり、ORA-00904 になる。

対応

単一引用符(')を代入したい場合には。単一引用符(')を連続記入する。

vVal := '代入したいリテラル';
vSQL := 'INSERT INTO ... VALUES (''' || vVal || ''')';
or
vVal := '''代入したいリテラル''';
vSQL := 'INSERT INTO ... VALUES ('|| vVal || ')';

INSERT INTO ... VALUES ('代入したいリテラル')

対応

リテラル表記 における引用符(')の置換を行なう。Oracle 10g

vVal := q'{'代入したいリテラル'}';
vSQL := 'INSERT INTO ... VALUES ('|| vVal || ')';
 


 

一覧ページへ戻る

OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー