毎度毎度、原因の分かりづらいエラーにハマりますw
今回は、「ORA-01036:illegal variable name/number」。
日本語に直訳された内容だと「変数の名前/数が無効です」となる。
具体的な行数も示されないので、原因箇所の特定に時間がかかりました・・・
エラー発生の状況
C#プログラム内部のSQL修正で発生。
組み込むのは
sql.AppendLine(" ここにSQL ");
こういう書き方をしてます。
原因は余分なパラメータ
あくまで今回の原因になりますが、バインド変数が過剰に設定されていました。
Oracleだと、パラメータで先にセットしておくやつですね。
今回、SQLを修正した際に、パラメータが1個不要になり、1個追加しました。
追加のパラメータは認識しているので追加をしていたんですが、不要になったパラメータを消すことを忘れてました。
C#ではパラメータの過不足はエラーの原因
C#で使用するときも別に書き方は変わらないので、SQLは基本的にそのまま使用できます。
sql.AppendLine(" ここにSQL ");
ただ、上記の記述の仕方をしているので、1行ごとに分かれます・・・
これは、変換マクロを使うなり、見づらくてもいいなら極端な話として1行で書き切ってもいいわけです。
C#で許容してくれないのは、パラメータでした。
Oracleで実行している分にはパラメータの不足は指定するものがないということですぐに判明するんですが、多い分にはエラーになりません。
単に使われないだけなので。
C#では、余計なパラメータはエラーになります。
つくづく分かりにくいエラー内容
「変数の名前/数が無効です」という日本語だと、原因が分かりづらかった。
例えば、Where句での条件でNUMBER型変数とNVARCHAR2型の変数で判定をしているとか思いついたけど、そもそもOracleで実行する分にはエラーになってないしなぁ・・・
って感じで。
Oracleの不親切なエラーメッセージ ~ORA-01036
結論としてはSQL中に変数を書く場合、変数名の前にコロン”:”を書くのだが、これを忘れているところが1箇所あったようだ。
分かってしまえばなんてことない話しなんだが、なんせ的を得ないエラーメッセージ。
ちょっと複雑なSQLだと間違い箇所を探すのは至難の業。
今回は整形して見やすくした結果、1000行を超えるSQLだったので、どこが原因やら・・・って感じでw
外部でセットしたパラメータを1個ずつ確認するはめに。
エラー発生行とか分かればなぁ・・・
SQLとして正しいかどうかっていうのがあるので、完全なエラーの特定は難しいけど、もう少し分かりやすい方法はないかな。
特に今回はC#なので、ORACLEとしてのエラーとは別に、パラメータの過不足くらいなら(簡単に言うw)判断できるようになるといい。
あー、違うな。
社内作成のDB使用クラスで実行されてればいいのか。
駄目だな、必要に迫られてないので、機能追加を進言してもSQL作る時に気をつけろ!で終わってしまう・・・
まとめ
パラメータの確認はしっかりと。
エラーにならないからといって、余計なパラメータを残しておくのはダメ。
当面はテキストエディタの検索機能に頼るしかないかな。