エンジニア 技術

【原因不明】ORA-00911: 文字が無効です。の解決方法

A5M2といったデータベース操作ツールでは実行できるのに
Javaなどに移して実行すると「ORA-00911: 文字が無効です。」のエラーが出てしまうことありませんか?

oracleの原因記載のページに該当してないのになぜ???

ってなったのでエラーの解決法を参考にしてください。

「文字が無効です」に対するoracleが記載しているエラーの原因は3つあります。

1.非引用識別子の先頭文字に英字以外の記号や数値、日本語を使用している。

非引用識別子とは CREATE TABLE EMP…

EMPの部分のようにダブル区ウォーテーションを用いない場合に自由に名前をつける箇所のことを指しています(エイリアス名なども)

対策:非引用識別子では英字 アンダースコア( _ )ドル記号($)シャープ記号(#)

だけが使用できます。DBツールで実行できるなら関係なさそうです

ここに該当するケースはあまりないかと思います。

2.SQL 文の中に全角スペースなどが混入している。

半角全角の切り替え時などに全角のスペースが混入してしまうとエラー

対策:検索や置換機能を用いて全角スペースを検出することができます。上と同様にDBツールで実行できるなら問題ないと思います。

3. SQL 実行インターフェイスを使用している場合に SQL 文の終端にセミコロン(;) が付けてある。

DBツールではSQLの区切り文字としてセミコロンを用いることができます。

しかしJavaでString Bufferなどを用いてクエリを通す場合は不要になります。

対策:Javaや動的SQLのクエリの終端のセミコロンを取り除く。このケースは意外とやってしまうことが有ります。これで解消されたらラッキーです!

上記でも解決しない場合の対策

上の3つのケースに該当しない場合があるんですよ、どこが原因やねん!!!

となりました

A5M2を使うことが多く、選択したクエリから言語に合わせてコードの自動生成してJavaなどに移すことがほとんどです。

原因はわからないのですが、手打ちするとエラーが無くなる場合があります。

とはいえ実務のSQLは結構長い場合がほとんどかと思います。

効率的に原因を炙り出す方法をお伝えします。

1.SQLを区切って部分的に挙動を確認する

例えば副問い合わせないのクエリやselect文でWHERE句以降などです

部分的に実行して(不要な箇所をコメントアウト)動くか確認しましょう

動く場合そこは手打ちする必要ないですから

2.構文の部分だけ手打ちする

select , delete from , insert into values, などのSQL構文だけ手打ちしてみましょう

細かい項目は後回し、というか打ちたくないですよ本気で、

構文だけの手打ちで修正してみると動くことがあります。

3.残りの部分を手打ち

こうなったらヤケクソです。。。

やるしかないです。とてもめんどくさいですが試す価値はあります。

以上がORA-00911: 文字が無効です。の対処法となります。

-エンジニア, 技術