我用的是oracle数据库,使用PreparedStatement的时候,里面有一个number类型的条件IN (?) , 使用pstmt.setStrin(1, "'1','2','3','23'");或者pstmt.setString(31, "1,2,3,23");都会出错,报的是java.sql.SQLException: ORA-01722: invalid number,请大家指点。

解决方案 »

  1.   

    IN关键字不应该这样用,(?,?,?,?)
    pstmt.setStrin(1, "1");
    pstmt.setStrin(2, "2");
    ..........
      

  2.   

    同上最好把你的SQL语句贴出来。
      

  3.   

    sql文如下:
    SELECT
    SAD_MTSMR_DT_WK.SHOHN_NM,
    SAD_MTSMR_DT_WK.BUZAI_QTY
    FROM
    SAD_MTSMR_DT_WK
    WHERE
    SAD_MTSMR_DT_WK.MTSMR_NO = '0000000015'
    AND SAD_MTSMR_DT_WK.MTSMR_MEI_NO = '1'
    AND SAD_MTSMR_DT_WK.HMBI_HNMK_SHBTS_CD IN (?)不管SAD_MTSMR_DT_WK.HMBI_HNMK_SHBTS_CD是number类型的还是varchar类型的,使用preparedStatement的时候,都无法添加多个参数,pstmt.setStrin(1, "'1','2','3','23'");都不能查出数据,但是直接运行sql是可以查出数据的。
    不能使用多个问号,因为参数?是通过list里的值多少来决定个数的。是不是preparedStatement不支持?可以替换成多个参数的情况。
      

  4.   

    当然可以通过list里的大小来决定?的个数,简单的说就是一个sql语句的拼写,这个应该很简单的。
    String  = "?,?,?,?,?,?,?,?,?,?,?,?,?,";//可能的最大值
     sql += .substring(o,list.size()*2-1);
    sql += ")";
    Iterator iterator = list.iterator();
    int i = 0;
    while(iterator.hasnext){
    pstmt.setString(++i, (String)iterator.next());

    这不就可以了吗?
      

  5.   

    回楼上的几位朋友,非常感谢你们的回答。
    但是,我并不是想去解决现在的这个问题,因为实际中我用自己组装sql的方法,已经绕过了这个问号是多个参数的情况。现在我想问的是[技术上]是不是preparedStatement不支持?可以替换成多个参数的情况。因为我测试过的情况是,不管这个?是String的还是number型的,都不支持pstmt.setString(1, "'1','2','3','23'");的情况(程序不出错,但是执行结果不是我预期的,没有数据)。
    不知道大家试验后,是不是也不行?希望我的问题表达清楚了。挥汗~~~~~
      

  6.   

    select * from tablename where col1 in (?);如果:setString(1, "'1','2','3','23'"); 
    那么:select * from tablename where col1 in ("'1','2','3','23'"); 
    括号里只有一个参数,
    和 select * from tablename where col1 in ('1','2','3','23'); 是不同的。
      

  7.   

    如果 col1 的类型是 number
    正确的 sql 应该是 select * from tablename where col1 in (1,2,3,23); 也不应该是select * from tablename where col1 in ('1','2','3','23');
      

  8.   

    回trumplet(检查)我知道String类型的sql为:
    select * from tablename where col1 in ('1','2','3','23'); number的sql为:select * from tablename where col1 in (1,2,3,23); 按照你说的是不是没有办法把in ('1','2','3','23'); 变成in (?)的方式,也就是说我最想知道的问题答案是:[技术上]preparedStatement不支持?可以替换成多个参数的情况。是这个意思吗?
      

  9.   

    这个是要循环来做的的。可以参考hibernate里面的代码实现
      

  10.   

    preparedStatement应该不支持替换成多个参数的情况。