QA@IT
«質問へ戻る

質問を投稿

PreparedStatementにリストを埋め込む方法について

はじめまして

PreparedStatementのプレースホルダに、","で区切ったリストを埋め込みたいのですが、
思い通りにゆかず困っております。

以下のようなソースがあって、
------------------------------------------------------------
import java.sql.*;

public class pptest{
public static void main(String ags[]){
PreparedStatement ps;
Connection con;
ResultSet rs;

    String str_name;
    String str_address;

    try{
        Class.forName("org.postgresql.Driver");
        con = DriverManager.getConnection("jdbc:postgresql:mydb",
                                          "user",
                                          ""
                                          );

        ps = con.prepareStatement("select name, address from addrt where id in (?)");
        ps.setString(1, ags[0]);
        rs = ps.executeQuery();

        while(rs.next()){
            str_name = rs.getString("name");
            str_address = rs.getString("address");

            System.out.println("name: "+str_name+" address: "+str_address);
        }

        rs.close();
        ps.close();
        con.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

}
------------------------------------------------------------

19行目のprepareStatement()のSQL中の"?"に、複数の値を入れてSELECTをかけたくて

$ java pptest "1,2" #<- "select name, address from addrt where id in (1,2)"としたい

とやってみたのですが、Exceptionが発生してしまいます

---------------------------------------------
org.postgresql.util.PSQLException: ERROR: invalid input syntax for integer: "1,2"

    at org.postgresql.util.PSQLException.parseServerError(PSQLException.java:139)
    at org.postgresql.core.QueryExecutor.executeV3(QueryExecutor.java:156)
    at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:101)
    at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:43)
    at org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:517)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:50)
    at org.postgresql.jdbc1.AbstractJdbc1Statement.executeQuery(AbstractJdbc1Statement.java:233)
    at pptest.main(pptest.java:21)

------------------------------------------------------------

引数を1つだけ("java pptest 1"など)としてやるとうまくゆくので、
このプレースホルダには整数型が1個しか入らないということは何となくわかるのですが、
こういうものなのでしょうか?
回避策等ご存じの方がいらっしゃいましたら、ご教授いただけると幸いです
(あるいはPostgres特有の問題なのか。。)

環境は、以下の通りです。
OS : Vine Linux 2.6
JDK : 1.4.2_04
DB : Postgres 7.4.2

よろしくお願いいたします。

## もともとはJakartaプロジェクトのdbutilを使ったアプリで上記のような
IN演算子に可変個のリストを入れたSQL文を発行したいというのが発端です。
こんな時一般的にはどうするものなのでしょうか。

----------------------------------------------
List rlist;
org.apache.commons.dbutils.QueryRunner runner;
String sql="select name, address from addrt where id in (?)";
String id_sel="1,2";
(中略)
rlist = (List)runner.query(sql,
id_sel,
new org.apache.commons.dbutils.handlers.BeanListHandle(XXXbean.class));

質問者:gotaro

はじめまして

PreparedStatementのプレースホルダに、","で区切ったリストを埋め込みたいのですが、
思い通りにゆかず困っております。

以下のようなソースがあって、
\------------------------------------------------------------
import java.sql.*;

public class pptest{
    public static void main(String ags[]){
        PreparedStatement ps;
        Connection con;
        ResultSet rs;

        String str_name;
        String str_address;

        try{
            Class.forName("org.postgresql.Driver");
            con = DriverManager.getConnection("jdbc:postgresql:mydb",
                                              "user",
                                              ""
                                              );

            ps = con.prepareStatement("select name, address from addrt where id in (?)");
            ps.setString(1, ags[0]);
            rs = ps.executeQuery();

            while(rs.next()){
                str_name = rs.getString("name");
                str_address = rs.getString("address");

                System.out.println("name: "+str_name+" address: "+str_address);
            }

            rs.close();
            ps.close();
            con.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
\------------------------------------------------------------

19行目のprepareStatement()のSQL中の"?"に、複数の値を入れてSELECTをかけたくて

$ java pptest "1,2"   #<- "select name, address from addrt where id in (1,2)"としたい

とやってみたのですが、Exceptionが発生してしまいます

<Exception全文>---------------------------------------------
org.postgresql.util.PSQLException: ERROR: invalid input syntax for integer: "1,2"

        at org.postgresql.util.PSQLException.parseServerError(PSQLException.java:139)
        at org.postgresql.core.QueryExecutor.executeV3(QueryExecutor.java:156)
        at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:101)
        at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:43)
        at org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:517)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:50)
        at org.postgresql.jdbc1.AbstractJdbc1Statement.executeQuery(AbstractJdbc1Statement.java:233)
        at pptest.main(pptest.java:21)
\------------------------------------------------------------

引数を1つだけ("java pptest 1"など)としてやるとうまくゆくので、
このプレースホルダには整数型が1個しか入らないということは何となくわかるのですが、
こういうものなのでしょうか?
回避策等ご存じの方がいらっしゃいましたら、ご教授いただけると幸いです
(あるいはPostgres特有の問題なのか。。)

環境は、以下の通りです。
OS  : Vine Linux 2.6
JDK : 1.4.2_04
DB  : Postgres 7.4.2

よろしくお願いいたします。


\## もともとはJakartaプロジェクトのdbutilを使ったアプリで上記のような
IN演算子に可変個のリストを入れたSQL文を発行したいというのが発端です。
こんな時一般的にはどうするものなのでしょうか。

<DButilアプリ主要部>----------------------------------------------
List rlist;
org.apache.commons.dbutils.QueryRunner runner;
String sql="select name, address from addrt where id in (?)";
String id_sel="1,2";
(中略)
rlist = (List)runner.query(sql,
                           id_sel,
                           new org.apache.commons.dbutils.handlers.BeanListHandle(XXXbean.class));


質問者:gotaro