日期:2014-05-17  浏览次数:20861 次

动态表名组装的sql,还能预编译吗?
如题:表名是由前缀detail和天数动态组装起来的,比如今天就是detail06,明天就是detail07,这样的sql使用prepareStatement预编译有效吗?怎么使用?


sql = "select sms_mt_send_detail"+day+" detail inner join ....  where detail.user_mobile = ? and ...."

------解决方案--------------------
你是不已经写了吗?

那你就
select * from ? where a = ?

传参数的时候把表名和值传进去。。
------解决方案--------------------
引用:
你是不已经写了吗?

那你就
select * from ? where a = ?

传参数的时候把表名和值传进去。。


我改成这样,但是报错 说是invalid table name,检查了一下,tableName值没问题

sql = "select detail.create_time,detail.send_time,detail.user_mobile,sms.message_content,detail.sender_biz_code,detail.errorcode,detail.ismg_status,detail.rpt_time from ? detail "
  +" inner join sms_mt_send sms on detail.mt_send_id = sms.mt_send_id "
  +" where detail.user_mobile = ? and to_char(detail.create_time,'yyyy-mm-dd')=? order by detail.mt_send_detail_id desc";

System.out.println(sql);
stmt=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
stmt.setString(1, tableName);
stmt.setString(2, user_mobile);
stmt.setString(3, toDate);

------解决方案--------------------
from ? detail


这是什么?表名不能有空格的,,,,
这样写
表1,表2

你少了一个逗号。。。。
------解决方案--------------------
这个是表的别名
------解决方案--------------------
哦,我知道了。你传进去的表名时带'' 单引号的。。你把单引号去掉。。
------解决方案--------------------
我在oralce 里 这么写

select * from &param 

param = t_test  没有单引号哦。。

这张表的数据就查出来啊。。
------解决方案--------------------
你在程序里边定义tablename的类型的时候,不要把它定义成String型,定义成Object型。。。
String 会带单引号的。。。
楼主这么冲动结了贴。。。
艾。。