论坛首页 Java企业应用论坛

PrepareStatement中的sql语句中的in查询问题

浏览 4627 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-30  
OO
正在开发一个小东西,需要俩个不同的数据库DB_A和DB_B(不同的实例),都是Oracle的
在库DB_A中的一个表A根据条件查出主键有1,2,3,4,5,6
拼好后为"1,2,3,4,5,6"

再在第二个库DB_B中的B表中把上面拼的字符串作为in的参数,如下
String in_data="1,2,3,4,5,6";
pst = 
  conn.prepareStatement("select id,name from B where id in ? ");
pst.setString(1,"("+in_data+")");


发现查不出记录,我又试
String in_data="1,2,3,4,5,6";
pst = 
  conn.prepareStatement("select id,name from B where id in ( ? )");
pst.setString(1,in_data);


还是不出记录,我再试
String in_data="1";
pst = 
  conn.prepareStatement("select id,name from B where id in ( ? )");
pst.setString(1,in_data);


终于出来了id=1的记录,似乎明白了点啥么
PrepareStatement是动态设定参数的,
也就是现在生成select id,name from B where id in ( ? )
一个?代表一个参数,pst.setString(1,"1,2,3,4,5,6"),
就相当于select id,name from B where id in ( '1,2,3,4,5,6' ),
没有id为'1,2,3,4,5,6'的记录,当然查不出来啦

但是由于我的in_data是根据条件动态改变的,由于俩查询在不同的DB实例中,所以用子查询是不行的;而用PrepareStatement设置in参数的时候就不能确定到底是用几个"?"

最后只好用Statement拼字符串了,不知道各位有啥好办法
   发表时间:2008-06-30  
给个提示
String[] in_datas=new String[]{"1", "2", "3"};

String inString=""
for(int i=0;i<in_datas.length;i++){
    if(i>0){
        inString+=", ";

    }
    inString+="?";
}

pst =    
  conn.prepareStatement("select id,name from B where id in ( "+inString+" )");   

for(int i=0;i<in_datas.length;i++){
    pst.set(i, in_datas[i]);
}

可以参考 org.hibernate.criterion 包的实现

0 请登录后投票
   发表时间:2008-06-30  
嘿嘿,in是有个数限制滴,要注意
0 请登录后投票
   发表时间:2008-06-30  
coldsky 写道
给个提示
String[] in_datas=new String[]{"1", "2", "3"};

String inString=""
for(int i=0;i<in_datas.length;i++){
    if(i>0){
        inString+=", ";

    }
    inString+="?";
}

pst =    
  conn.prepareStatement("select id,name from B where id in ( "+inString+" )");   

for(int i=0;i<in_datas.length;i++){
    pst.set(i, in_datas[i]);
}

可以参考 org.hibernate.criterion 包的实现



呵呵 不错 谢谢啊~~~~ 是个好方法
0 请登录后投票
   发表时间:2008-07-31  
llm6101 写道
coldsky 写道
给个提示
String[] in_datas=new String[]{"1", "2", "3"};

String inString=""
for(int i=0;i<in_datas.length;i++){
    if(i>0){
        inString+=", ";

    }
    inString+="?";
}

pst =    
  conn.prepareStatement("select id,name from B where id in ( "+inString+" )");   

for(int i=0;i<in_datas.length;i++){
    pst.set(i, in_datas[i]);
}

可以参考 org.hibernate.criterion 包的实现



呵呵 不错 谢谢啊~~~~ 是个好方法




思路很清晰,很新颖,呵呵
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics