Problema com query. [RESOLVIDO]

Pessoal, devo estar fazendo algo muito errado ou sei lá o que, pq minha consulta não funciona de jeito nenhum.

Vou colar meu código aqui e vejam se há algo errado pois minha consulta não retorna nada, mas existe dado na Base de dados.

[code]
public class ConsultaBoleto {

public void getDadosBoleto() {
	
	String sql = "SELECT * FROM DOCUMENTO_FISCAL WHERE NRDOCUMENTO_FISCAL = ?";
	try {
		Connection conn = new ConnectionFactory().getConnection(); //Minha conexão está OK
		PreparedStatement stmt = conn.prepareStatement(sql);
		stmt.setInt(1, 3969); //O campo é númerico
	
		ResultSet rs = stmt.executeQuery();
		
		while (rs.next()) {
			System.out.println("---while--- ");
			System.out.println(rs.getString(1));
		}
		stmt.close();
		try {
			conn.close();
		} catch (SQLException ex) {
			Logger.getLogger(ConsultaBoleto.class.getName()).log(Level.SEVERE, null, ex);
		}
	} catch (SQLException ex) {
		Logger.getLogger(ConsultaBoleto.class.getName()).log(Level.SEVERE, null, ex);
	}	

}

}[/code]

Deve ser uma coisa tosca que eu não estou enxergando, mas se eu tiro a cláusula do where, é retornado os dados, com o where, o ResultSet vem vazio e não dá erro nenhum.

Sei que você já deve ter olhado.

Mais existe mesmo o registro no banco de dados?

O tipo de dado no banco é numerico mesmo?

A consulta da algum erro ou nao retorna nada?

System.out.println(rs.getString(1)); 

Tenta trocar a linha de cima, passando o nome do campo em vez do índice.

Sim caras, o dado existe no banco e é do tipo numérico.
Não adianta nem mudar o índice pelo nome pois não chega nem a entrar no while. Qualquer consulta que tenha uma cláusula “where” tem dado isso. Não retorna nada. Tô achando isso muito estranho, sem explicação mesmo.

O banco é oracle e remoto, consigo estabelecer a conexão de boa e se eu dou só um “select * from tabela” ele me retorna os dados, mas quando tem where não traz nada.

Já tentei com Statement e com PreparedStatement ambos não retornam nada.
É de se assustar uma coisa dessas…

Edit: Já testei com outros drivers jdbc do oracle, já testei no Netbeans e no Eclipse. Só se for um erro meio “impossível” causado pelo Windows 7 que estou usando. A única coisa que veio na mina cabeça é se não é problema do Windows 7.

Você já tentou executar essa query com o where diretamente no banco de dados, sem usar JDBC?

Abraço

[quote=ctosin]Você já tentou executar essa query com o where diretamente no banco de dados, sem usar JDBC?

Abraço
[/quote]

Sim, copiei e colei, funciona numa boa. Só no java e especificamente quando tem where.
Por isso que tô começando a achar que é alguma incompatibilidade do windows. Não tem outra coisa…aparentemente está tudo certo.

Está usando MySQL? Tive um problema parecido com MySQL antes, resolvi colocando os campos do banco entre crase (``).

String sql = "SELECT * FROM `DOCUMENTO_FISCAL` WHERE `NRDOCUMENTO_FISCAL` = ?";

[quote=Beibin]Está usando MySQL? Tive um problema parecido com MySQL antes, resolvi colocando os campos do banco entre crase (``).

String sql = "SELECT * FROM `DOCUMENTO_FISCAL` WHERE `NRDOCUMENTO_FISCAL` = ?";

Vou tentar aqui pra ver se soluciona, mas não é MySQL não é o Oracle 11g.

Edit: Não funcionou não. O estranho é que ele sabe que existe a coluna pois não dá erro e se eu mudo o nome dela ele diz que o nome da coluna é inválido. Porém ainda assim não retorna nada.

Já teste com dois drivers do oracle, windows 7 e XP SP3, Eclipse e Netbeans.

Tô de mãos atadas. :x :cry:

Não é preciso de crase usando PreparedStatement. Os nomes foram definidos com letra maiúscula mesmo no banco? (alguns bancos de dados são case-sensitive).

Tente executar somente o seguinte (sem filtragem) para ver se algum resultado é exibido:

String sql = "SELECT * FROM DOCUMENTO_FISCAL";

E deixe o while como está.

Se eu consultar somente dessa forma:

String sql = "SELECT * FROM DOCUMENTO_FISCAL";  

O ResultSet traz resultados.

Se eu consulto assim:

String sql = "SELECT * FROM DOCUMENTO_FISCAL where 1=1";  

Ele também traz resultados.

Agora se eu consulto assim:

String sql = "SELECT * FROM DOCUMENTO_FISCAL WHERE NRDOCUMENTO_FISCAL = ?";  

Passando o valor para a “?”
Ele não traz nada.

Existe a coluna NRDOCUMENTO_FISCAL, ela possui dados e tem o dado que eu pesquiso. Tanto que se eu copio e colo esse SQL no PLSQL Developer, ele me retorna o resultado.

Tentou usar apenas o Statement ao invés do PreparedStatement? Veja se dá alguma diferença.

Já tinha tentado isso também amigo.
Um progresso que eu consegui fazer aqui foi o seguinte:

String sql = "SELECT * FROM SJBV.DOCUMENTO_FISCAL WHERE NRDOCUMENTO_FISCAL = (Select distinct MIN (NRDOCUMENTO_FISCAL) FROM SJBV.DOCUMENTO_FISCAL) ";

Essa consulta me retornou ok. Aí, peguei o valor do NRDOCUMENTO_FISCAL que ela retornou e usou na query original:

String sql = "SELECT * FROM DOCUMENTO_FISCAL WHERE NRDOCUMENTO_FISCAL = ?";  

Também me retornou o resultSet ok.
Aí vcs irão me falar, “então tá resolvido, o valor passado para a consulta não existe no Banco de Dados, por isso o resultSet não trazia nada”.

Porém, o valor existe na tabela, isso que me deixa mais encucado ainda. Como pode um valor que existe na base não retornar nada??
Bom, pelo menos já deu pra concluir que o código está ok o buraco é mais embaixo, resta saber onde…

Bom pessoal.
Pra variar, como eu disse antes (não sei se nesse tópico), quanto mais complicado o problema, mais simples é a solução.

Resolvi dar um select count aqui na tabela e vi que os valores não batiam. Resolvi dar uma procurada no Oracle e vi que a base é replicada, existe o mesmo nome, tudo certinho numa base de testes e mesmo meu programa apontado para a base de produção, todos os dados estão vindo da bendita base de teste. :oops:

Por isso consultas que retornam no PLSQL não retornam no Java. O PL está apontando para um lugar e o java para outro.
Nomes iguais de tudo e eu perdi uns 3 dias quebrando a cabeça pra descobrir isso.

Mas valew pela experiência e espero que se alguém sofrer desse mesmo mal, possa aproveitar esse tópico como ajuda. Um problema simples que se transformou numa bola de neve.

Obrigado a todos que ajudaram!
:wink:

Oi,

Edit seu primeiro tópico e coloque a tag [RESOLVIDO].
Fiquei lendo atentamente todos os post’s para tentar dar uma dica e quando fui ver já estava resolvido =)

Tchauzin!

[quote=lina]Oi,

Edit seu primeiro tópico e coloque a tag [RESOLVIDO].
Fiquei lendo atentamente todos os post’s para tentar dar uma dica e quando fui ver já estava resolvido =)

Tchauzin![/quote]

Obrigado pela dica…nem tinha me lembrado disso…Pode deixar que vou editar.
:wink: