Erro em metodo java para consulta de banco de dados

2 respostas
rolemberg

Senhores, bom dia…

Preciso da ajuda dos senhores, o metodo abaixo esta dando o seguinte erro, será que alguem consegue me ajudar…estou a dois dias já tentando resolver…

public List listarDados(String cliente, String dtInicial, String dtFinal) throws DisponibilidadeRedeDaoException {
		ArrayList lista = new ArrayList();
		try {
			try {
				conn = ConnectionFactory.abreConexao();
			} catch (NamingException e) {
				System.out.println("Erro ao abrir a conexao...");
				e.printStackTrace();
			}
			StringBuffer sql = new StringBuffer();
			
			sql.append("Select "); 
			sql.append("e.ds_cliente as Cliente, "); 
			sql.append("g.ds_pais as Pais, "); 
			sql.append("h.ds_cidade as Cidade, "); 
			sql.append("a.cd_conexion as ID_Conexion, "); 
			sql.append("k.ds_es_produto as Servico, "); 
			sql.append("concat(cast(month(a.dt_encerramento) as char(3)),cast(year(a.dt_encerramento) as char(4))) as Data, "); 
			sql.append("round(((float((max(a.qt_tempo_medido)-"); 
			sql.append("sum(a.qt_duracion_real_incid ))))/"); 
			sql.append("(((max(a.qt_tempo_medido)))))*100,2) as percentual_disponibilidade, "); 

			sql.append("sum(a.vl_meta_di)   as Meta "); 
			 
			sql.append("from  reparo_inter.fato_reparo_inter a, "); 
			sql.append("reparo_inter.dim_imputabilidade b, "); 
			sql.append("reparo_inter.dim_tp_incidencia d, "); 
			sql.append("geral.dim_cliente e, "); 
			sql.append("geral.dim_segmento_cliente f, "); 
			sql.append("geral.dim_pais g, "); 
			sql.append("geral.dim_cidade h, "); 
			sql.append("geral.dim_data i, "); 
			sql.append("geral.tb_de_para_cli_seg j, "); 
			sql.append("geral.dim_produto k, "); 
			sql.append("geral.dim_estado l, "); 
			sql.append("geral.dim_grupo_segmento_cliente m, "); 
			sql.append("geral.dim_grp_seg_cli_pai  n "); 

			sql.append("where "); 
			sql.append("a.id_imputabilidade  =  b.id_imputabilidade "); 
			sql.append("and a.id_tp_incidencia  =  d.id_tp_incidencia "); 
			sql.append("and a.id_cliente  =  e.id_cliente "); 
			sql.append("and e.id_cliente  =  j.id_cliente "); 
			sql.append("and j.id_segmento_cliente =  f.id_segmento_cliente "); 
			sql.append("and f.id_grupo_segmento_cliente =  m.id_grupo_segmento_cliente "); 
			sql.append("and m.id_grp_seg_cli_pai = n.id_grp_seg_cli_pai "); 
			sql.append("and a.id_cidade   = h.id_cidade "); 
			sql.append("and h.id_estado   = l.id_estado "); 
			sql.append("and l.id_pais   = g.id_pais "); 
			sql.append("and a.dt_encerramento  =  i.id_data "); 
			sql.append("and a.id_produto  = k.id_produto "); 
			sql.append("and e.ds_cliente  = '?' "); 
			sql.append("and b.ds_br_imputabilidade = 'TELEFONICA' "); 
			sql.append("and d.id_tp_incidencia = 3 "); 
			sql.append("and a.dt_encerramento between ? and ? "); 
			        
			sql.append("group by "); 
			sql.append("e.ds_cliente, "); 
			sql.append("g.ds_pais, "); 
			sql.append("h.ds_cidade, "); 
			sql.append("a.cd_conexion, "); 
			sql.append("k.ds_es_produto, "); 
			sql.append("a.dt_encerramento "); 
			 
			
			System.out.println(sql);
			this.stmt = conn.prepareStatement(sql.toString());
			System.out.println("preparou o sql");
			int index = 1;
			
			stmt.setString(index++, cliente);
			//System.out.println("data pra envio "+DataInicialParaEnvio(dtInicial));
			//System.out.println("data pra envio "+dataFinalParaEnvio(dtFinal));
			stmt.setString(index++, DataInicialParaEnvio(dtInicial));
			stmt.setString(index, dataFinalParaEnvio(dtFinal));
			
			rs = stmt.executeQuery();
			
			if (rs != null) {
				while (rs.next()) {
					index = 1;
					
					DisponibilidadeRedeTo acompanhamento = new DisponibilidadeRedeTo();
					
					acompanhamento.setCliente(rs.getString(index++));
					//System.out.println(rs.getString(index++));
					acompanhamento.setPais(rs.getString(index++));
					//System.out.println(rs.getString(index++));
					acompanhamento.setCidade(rs.getString(index++));
					//System.out.println(rs.getString(index++));
					acompanhamento.setConexao(rs.getString(index++));
					//System.out.println(rs.getString(index++));
					acompanhamento.setServico(rs.getString(index++));
					//System.out.println(rs.getString(index++));
					acompanhamento.setData(rs.getString(index++));
					//System.out.println(rs.getString(index++));
					acompanhamento.setPercentualDisponibilidade(rs.getString(index++));
					//System.out.println(rs.getString(index++));
					acompanhamento.setMeta(rs.getString(index++));
					//System.out.println(rs.getString(index++));
					
					lista.add(acompanhamento);
				}
			}
		} catch (SQLException e) {
			throw new DisponibilidadeRedeDaoException(e.getErrorCode(), e.getMessage());
		}
		
		finally{
			closeResource();
		}
		System.out.println("saiu do dao");
		return lista;
	}


private String DataInicialParaEnvio(String data) {
		StringBuffer retorno = new StringBuffer();
		
		String [] separarData = data.split("/");
		
		retorno.append(separarData[1]);
		retorno.append('-');
		retorno.append(separarData[0]);
		retorno.append('-');
		retorno.append("01");
		
		return retorno.toString();
	}

private String dataFinalParaEnvio(String data) {
		StringBuffer retorno = new StringBuffer();
		String dia = "31";
		String [] separarData = data.split("/");
		String mes = separarData[0];
		if (mes.length() == 1) {
			mes = '0' + mes;
		}
		
		String ano = separarData[1];
		
		if (mes.equals("04") || mes.equals("06") || mes.equals("09") || mes.equals("11")) {
			dia = "30";
		} else if(mes.equals("02")) {
			if (Integer.parseInt(ano)%4 == 0) {
				dia = "29";
			} else {
				dia = "28";
			}
		}

Esta gerando o seguinte erro:

The number of host variables in the EXECUTE or OPEN statement is not equal to the number of values required.

Obrigado a todos…

2 Respostas

G

amigo, esse sql esta correto? vc jah fez o teste no proprio banco pra ver se obtem resultado

vlws

felipedamiani

Olha esta linha:

sql.append("and e.ds_cliente  = '?' ");

Você está querendo comparar mesmo como um ‘?’, se sim aqui:

stmt.setString(index++, cliente);  
 //System.out.println("data pra envio "+DataInicialParaEnvio(dtInicial));  
 //System.out.println("data pra envio "+dataFinalParaEnvio(dtFinal));  
 stmt.setString(index++, DataInicialParaEnvio(dtInicial));  
 stmt.setString(index, dataFinalParaEnvio(dtFinal));

Você seta 3 parametros enquanto da sql é 2

Criado 22 de fevereiro de 2008
Ultima resposta 22 de fev. de 2008
Respostas 2
Participantes 3