Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

SQL文をStringで当てはめたいが、PSQLExceptionになる

初心者の為、マナー違反がありましたら申し訳ありませんが、
ご教示の程、よろしくお願いいたします。

SQL文をStringで書いて、当てはめたいと思っていますが、うまくいきません。
現在のソースです。

String testSql = "SELECT * FROM test_tbl WHERE testno LIKE \'%?%\' ";
PreparedStatement stmt = con.prepareStatement(testSql);
stmt.setString(1, ActionFormから値を取ってくる);
ResultSet result = stmt.executeQuery();

これだとstmt.setStringの部分で、以下のように落ちてしまいます。

org.postgresql.util.PSQLException: The column index is out of range: 1, number of columns: 0.

\'%?%\' を %?% にするとResultSetまで行きますが、
syntax errorで同じようにPSQLExceptionとなります。
原因はSQL文でしょうか?

DBはPostgreSQLを使っています。
よろしくお願いいたします。

5

回答

14460

閲覧

5件の回答

評価

0

例外の文はちゃんと読んでる?
エラー起きたから適当に対処したら変わった、でも分からない、じゃあ解決なんてできない。

評価

0

読んでる?というか、例外のメッセージを検索するのは基本ということ。

評価

0

$さん、早速のご回答ありがとうございます。

すみません、例外の文は読んでいます。
検索しましたが、結果的に分かりませんでしたので、
こちらを利用させて頂きました。

The column index is out of range
上記の内容だと、
stmt.setString(1, ActionFormから値を取ってくる);
の1が間違っていると指摘されているように思いますが、
1つ目の?に値をセットしたいですし、実際にSQL文の中でも?は1つしか使用していません。。。

LIKEを使わない以下のSQLは実行できています。

String testSql = "SELECT * FROM test_tbl WHERE testno = ? ";
PreparedStatement stmt = con.prepareStatement(testSql);
stmt.setString(1, ActionFormから値を取ってくる);
ResultSet result = stmt.executeQuery();

そこで、私はSQL文を疑っています。
CSEを使用して、
SELECT * FROM patient_tbl WHERE pati_no LIKE '%?%'
の?に値をセットして実行すると問題ありませんでした。
それで、'に\を付加した次第です。

私はだいぶ見当違いなことをしていたりしますか。。。?

評価

0

likeを使う時は特殊になるみたいです

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10098&forum=12&4

↑参照してください。

評価

0

スイカさん、ありがとうございました!
お教えいただいたページに記載されていた方法で改善できました。

SELECT * FROM test_tbl WHERE testno LIKE \'%?%\'
stmt.setString(1, ActionFormから値を取得);    を
 ↓
SELECT * FROM test_tbl WHERE testno LIKE ?
stmt.setString(1, "'%"+ ActionFormから値を取得 + "%'");

大変助かりました。。。昨日から悩んでいたので。
検索するキーワードも、考える必要がありますね。
どうもありがとうございました!

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。