[DUVIDA] Provavelmente Sintaxe de PostgreSQL

3 respostas
M3g4d3th

Bom dia a todos, estou com uma dúvida provável de sintaxe de PostgreSQL, pesquisei alguns tutoriais do banco de dados e de sintaxe mas não consegui concluir o exercício do FJ-21 da Caelum.

Vejam minhas classes por favor e depois a dúvida.

Tenho a Classe FuncionarioDAO

package br.com.caelum.banco;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.caelum.programa.Funcionario;

public class FuncionarioDAO {

	// variavel de conexao
	private Connection connection;

	// construtor
	public FuncionarioDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}

	// adiciona na tabela funcionario
	public void adiciona(Funcionario funcionario) {
		String sql = "insert into funcionarios (nome, usuario, senha) values (?,?,?)";

		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setString(1, funcionario.getNome());
			stmt.setString(2, funcionario.getUsuario());
			stmt.setString(3, funcionario.getSenha());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// pesquisa na tabela funcionario
	public List<Funcionario> pesquisa() {

		try {
			List<Funcionario> funcionarios = new ArrayList<Funcionario>();
			PreparedStatement stmt = this.connection
					.prepareStatement("select * from funcionarios");
			ResultSet rs = stmt.executeQuery();

			// funcionarios = new ArrayList<Funcionario>();

			while (rs.next()) {
				Funcionario funcionario = new Funcionario();
				funcionario.setNome(rs.getString("nome"));
				funcionario.setUsuario(rs.getString("usuario"));
				funcionario.setSenha(rs.getString("senha"));
				funcionario.setId(rs.getLong("id"));

				funcionarios.add(funcionario);
			}

			rs.close();
			stmt.close();
			return funcionarios;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	// remove linha de funcionario por ID
	public void remove(long numero) {

		String sql = "delete from funcionarios where id=?";
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, numero);
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	//altera tabela funcionario conforme id
	public void altera(Funcionario funcionario, long id) {
		String sql = "update funcionarios set nome=?, usuario=?, senha=?, where id=?";

		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, id);
			stmt.setString(2, funcionario.getNome());
			stmt.setString(3, funcionario.getUsuario());
			stmt.setString(4, funcionario.getSenha());
			stmt.setLong(1, id);

			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

E a classe de TesteFuncionario

package br.com.caelum.teste;

import java.util.List;

import br.com.caelum.banco.FuncionarioDAO;
import br.com.caelum.programa.Funcionario;

public class TesteFuncionario {

	public static void main(String[] args) {

		Funcionario f1 = new Funcionario("Laura", "lauri", "guapa");
		
		FuncionarioDAO fDAO = new FuncionarioDAO();
		

		List<Funcionario> func = fDAO.pesquisa();

		for (Funcionario funcionario : func) {
			System.out.println("");
			System.out.println("Id: " + funcionario.getId());
			System.out.println("Nome: " + funcionario.getNome());
			System.out.println("Usuario: " + funcionario.getUsuario());
			System.out.println("Senha: " + funcionario.getSenha());
		}

		fDAO.altera(f1, 3);
		
	}

}

E o erro que aparece:

Id: 3
Nome: Vinicius
Usuario: vini
Senha: 123456

Id: 4
Nome: Laura
Usuario: lauri
Senha: guapa
Exception in thread "main" java.lang.RuntimeException: org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a "where"
  Posição: 56
	at br.com.caelum.banco.FuncionarioDAO.altera(FuncionarioDAO.java:99)
	at br.com.caelum.teste.TesteFuncionario.main(TesteFuncionario.java:27)
Caused by: org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a "where"
  Posição: 56
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:381)
	at br.com.caelum.banco.FuncionarioDAO.altera(FuncionarioDAO.java:95)
	... 1 more

Apreciando a Exception eu vejo que tenho um problema justo no WHERE do meu ALTERA em FuncionarioDAO, e ele informa o erro de sintaxe.

Ou seja, o que eu gostaria era de informar o número da ID no TestaFuncionario e alterar o mesmo com as novas informações conforme instanciado objeto.

Alguém pode me ajudar? Se tiver um tutorial muito bom de postgres por favor, agradeceria muito também.

Abraço
Vinicius Assis

3 Respostas

Henrik

public void altera(Funcionario funcionario, long id) { String sql = "update funcionarios set nome=?, usuario=?, senha=?, where id=?";

Retire a virgula antes do where.

fabiomedeirosf

Seguinte,
neste linha:

String sql = "update funcionarios set nome=?, usuario=?, senha=?, where id=?";

remova a virgula depois do coringa da senha, ficando assim:

String sql = "update funcionarios set nome=?, usuario=?, senha=? where id=?";

Testa aí.

M3g4d3th

fabiomedeirosf:
Seguinte,
neste linha:

String sql = "update funcionarios set nome=?, usuario=?, senha=?, where id=?";

remova a virgula depois do coringa da senha, ficando assim:

String sql = "update funcionarios set nome=?, usuario=?, senha=? where id=?";

Testa aí.

Ae cara, funcionou, impressionante como uma vírgula pode te deixar loco por 1 hora. rsss

Se tiver mais alguma dica, tutorial ou algum artigo relacionado a PostgreSQL e puder enviar eu agradeço.

Abraço.
Vinicius Assis

Criado 19 de janeiro de 2011
Ultima resposta 19 de jan. de 2011
Respostas 3
Participantes 3