【Java】SQLException: INまたはOUTパラメータがありません - 索引:: 1 | 人生のエラー集

人生のエラー集

バグ出し率トップを誇るへっぽこプログラマーが発生させたエラーをメモのために残します。
同じエラーで悩む人の解決策になりますように…

趣味のことも書いたりしますが。

久しぶりに書いてみました。
バグばっかり出しますけど、原因はググれば結構出てきますからね。

今回は原因と解決策があやふやなバグです。
これは結構くせ者で、だけどもエラーを発生させる人はいないんだろうなー
という感じの内容となってしまいました。

Javaを使ってOracleDBにデータを無造作に突っ込むっていうプログラムを勉強がてら作っていたら、
こんなエラーが出ました。

java.sql.SQLException: INまたはOUTパラメータがありません - 索引:: 1

何これ?
パラメータが足りないのかな?
カラム数とVALUESの数が合わないのかな?
それとも・・・・・・何?

色々チェックしてたら1時間以上ハマりました。
バインド変数使ってたんですけど間違ってないし、カラムの数も一致していました。
Javaで実行されるSQLを作って、CSEとかのツールで実行もできたんです。
問題ないはずなのに…

さて、心当たりがあるとしたら、、、
唯一べた書きしている日付のみ!(何故?)

PreparedStatementを使っていて、VALUESの値はバインド変数を使ってたんですけど、
日付はバインド変数を使わずにINSERT文に適当な日付を入れていました。なんとなく。
SQLは↓みたいな感じです。
INSERT INTO TEST_TABLE (ID, NAME, FLAG, DATE) VALUES(?, ?, ?, 1988-09-21 00:00:00)

解決策は、「日付もバインド変数に入れる」ことでした。。。
当たり前!

PreparedStatementは日付が直接書かれたSQLを受け付けないみたいですね。
画面からの入力値をそのまま使ってINSERT文を使ったりしていると起こりそうなエラーです。
ただ、調べても全然出てきませんでした。
こんなことする人いないんだろうな。
DATEはおとなしくバインド変数使って入れましょう。はい。
TIMESTAMPも同じです。バインド変数必須です。はい。

その前に、本当にこれが原因なのかわからないです。
解決はしましたけど、内部でどんなことが起こっているのか詳しく知りたいですね。

バインド変数の重要性に気付かなかった過去の自分に、さようなら。