dropkai 2011-06-10
今天在java中拼接sql时犯了一个很低级的错误,sql语句拼接好以后,查询总是报ORA-00937: 不是单组分组函数,检查了好久都没没有找到错误的原因,在控制台打印的sql语句放到pl/SQL中执行也没错,但死活在junit测试的时候报ORA-00937的错误,忽然灵感来了,发现原来是我往dao中设置拼接好的sql语句不完整,group by子句和order子句都没有拼接到sql语句中。
代码如下: 灰色背景的语句应该在绿色背景语句下
this.getDAO(); log4j.info(LogUtil.cSqlLogString("数据库连接:",dao.getConnection().toString()));
StringBuffer lsSQL = new StringBuffer();
List<Object>laParameter=newArrayList<Object>();
//开始时间
Stringbtimecode="";
//结束时间
Stringetimecode="";
if(!"".equals(timecode)&&null!=timecode){
if(timecode.indexOf(",")!=-1){
btimecode=timecode.split(",")[0];
etimecode=timecode.split(",")[1];
btimecode=ZztDateUtil.getWeekBegin(Integer.valueOf(btimecode.substring(0,4)),Integer.valueOf(btimecode.substring(4,6)));
etimecode=ZztDateUtil.getWeekBegin(Integer.valueOf(etimecode.substring(0,4)),Integer.valueOf(etimecode.substring(4,6)));
}else{
btimecode=ZztDateUtil.getWeekBegin(Integer.valueOf(timecode.substring(0,4)),Integer.valueOf(timecode.substring(4,2)));
}
}
lsSQL.append(getWwtpSQL());
//开始时间不为空时
if(!"".equals(btimecode)&&null!=btimecode){
laParameter.add(btimecode);
lsSQL.append("\nandbegintime>=to_date(?,'yyyy-MM-dd')");
}
//结束时间不为空时
if(!"".equals(etimecode)&&null!=etimecode){
laParameter.add(etimecode);
lsSQL.append("\nandbegintime<=to_date(?,'yyyy-MM-dd')");
}
dao.setSQL(lsSQL.toString(),BaseDAO.DAOSQL,true);
lsSQL.append("\ngroupbyregioncode,regionname");
lsSQL.append("\norderbyregioncode");
int liIndex=1;
for(intliLoop=0;liLoop<laParameter.size();liLoop++){
dao.setParameterValue(liIndex++,laParameter.get(liLoop));
}
log4j.info(LogUtil.cSqlLogString("污水处理厂总量按直辖市汇总-"+btimecode+"至"+etimecode+":",lsSQL.toString()));
lRetMsg = dao.executeQuery(SysConfig.COMMON_DHO);