C#で発生するORA-01036:illegal variable name/numberのエラーの解決法

投稿日:

毎度毎度、原因の分かりづらいエラーにハマります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作る時に気をつけろ!で終わってしまう・・・

まとめ

パラメータの確認はしっかりと。

エラーにならないからといって、余計なパラメータを残しておくのはダメ。

当面はテキストエディタの検索機能に頼るしかないかな。

 







-ORACLE
-

関連記事

ORACLEでTO_CHARを使用し、カンマ区切りデータを出力する

帳票出力を行うPGで困った。 数値形式のデータのため、カンマ区切りで表示したいんだけど、テンプレートの制約のせいで上手く行かなくて時の解決方法。 帳票のテンプレートとなるファイルのセルは文字列形式。 …

no image

Oracleの再受験無料キャンペーンは5月31日まで

【ピアソンVUE専用】Oracle会場試験用受験チケット(電子チケット) 価格:26,720円 (2019/5/19 14:11時点) 感想(15件) 【ピアソンVUE専用】Oracleオンライン試験 …

[C#]リストをカンマ区切りの文字列で出力する

リストの項目をカンマ区切りで出力したい 卵が先か鶏が先か~って話じゃないんですが、リストで出力した内容をカンマ区切りのデータにする必要が出てきたので、調べました。 List<string> …

ORACLEで他のスキーマでSQLを実行した時に、権限不足で「ORA-01031: 権限が不足しています。」のエラーになる

A5Mk2 http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/ 普段、SQL関連は、A5Mk2っていうソフトを使用しています。 今回のエラーは、自 …

続) 何度だって引っかかるORACLEのエラー・・・。ORA-01008:バインドされていない変数があります。

この土日は休日出勤でした・・・ そして、昨日・・・新しい現象が発生しました。 日本の中心付近で仕様変更と闘うSE日記日本の中心付近で仕様変更と闘うSE日記http://ht-jp.net/blog/p …


カテゴリー