Problema com UPDATE no HSQLDB "unexpected token: = required: ( in statement [UPDATE..."

Boa noite,

Não estou conseguindo fazer um UPDATE no HSQLDB. O INSERT INTO, CREATE TABLE estão saindo, mas o UPDATE não. Não sei o que é. Não estou conseguindo enxergar o meu erro. Para CREATE e INSERT uso essa mesma função que me retorna um PreparedStatement.

Statements st = new Statements();
	String sql = "UPDATE MJ SET Value = ? WHERE Row = ?";
	
	PreparedStatement ps = st.CreatePreparedStatement(sql, conn);
	
	try {			
		ps.setString(1, J11); ps.setInt(2, 1);
		ps.executeUpdate();
	}catch(SQLException e) {
		JOptionPane.showMessageDialog(null, e.getMessage());
	}finally {
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException ex) {
				JOptionPane.showMessageDialog(null, ex.getMessage());
			}
		}
	}




public PreparedStatement CreatePreparedStatement(String sql, Connection conn) {
	try {
		return conn.prepareStatement(sql);
	} catch (SQLException e) {
		JOptionPane.showMessageDialog(null, e.getMessage());
		return null;
	}
}

Estou editando para acrescentar mais informação… O código da erro na hora de criar o PreparedStatement. O erro está no comando sql (ao que tudo indica). Mas eu não estou conseguindo ver erro alí.

O campo Row está recebendo 1 do seu PS, será sempre 1 para o SQL?

Experimente utilizar ps.execute(); ao invés de ps.executeUpdate();

Então, esse 1 do ps não está influenciando… Tenho mais valores nessa tabela. A minha intenção é atualizar mais de um desses valores de uma única vez (esse é apenas um desses valores). E como sei onde estão localizados, acabei fixando a linha.

Voltando ao problema. Depois que postei o comentário, eu verifiquei que o erro encontra-se na string do UPDATE.

Eu verifiquei a variável ps aqui, e ela chega igual a null na atribuição dos parâmetros. Eu recebo dois erros aqui:
1 - Na função que cria o PreparedStatement. Ocorre o erro do título (unexpected token: = required: ( in statement [UPDATE MJ SET Value = ? WHERE Row = ?]). (Verifiquei a variável ps, e ele chega igual a null na atribuição dos parâmetros);
2 - Na linha da atribuição dos parâmetros. (O ps é igual a null, então não tem como inserir os parâmetros).

Verifiquei a variável ps aqui, e ela é igual a null (não está gerando o PreparedStatement por conta da string UPDATE). Como não gera o PS, não tem como atribuir os parâmetros (ocorre o segundo erro). Alterar o ps.executeUpdate() não vai funcionar.

E até onde eu li, não está errado utilizar o executeUpdate().

Não disse isto.
Normalmente utilizo assim:

con = DriverManager.getConnection(caminho, usuario, senha);
PreparedStatement pst = con.prepareStatement("update usuarios set nome_usuario=? where codigo_usuario=?");
            pst.set's ....
            pst.execute();

Entendi. Não seria de todo ruim testar o execute. Mas o erro está nesta string…

Eu vou tentar alterar o nome da tabela e das colunas para ver se isso influencia em alguma coisa. Hoje li sobre alguém que teve um erro parecido pelos nomes das tabelas e colunas que ele utilizou entrarem em conflito com nomenclaturas utilizadas pelo BD ou pelo provedor. Era com outro banco dados (não com o HSQLDB). Até tentei adotar a mesma solução, mas não funcionou comigo.

Pode ser palavra reservada também. Não é de duvidar.

1 curtida

Isso mesmo! Não precisei nem alterar os campos para saber. Por “palavras reservadas” consegui encontrar esse link: As 1.226 palavras reservadas encontradas nos principais SGBD (SQL)
Que me levou até o arquivo Tokens.java e me fez encontrar a lista de palavras reservadas do HSQLDB. Não posso usar ROW e VALUE. Obrigado!

Será que tem como inserir uma palavra reservada com algum colchetes, aspas, aspas simples etc? Nesse tópico que li, um par de colchetes resolvia o problema. Tentei aqui e não deu certo. Tentei parênteses também e também não funcionou.

1 curtida

Se é reservada, melhor não utilizar mesmo.