Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Statement.RETURN_GENERATED_KEYS e outros possiveis parametros

Outros possíveis parâmetros para o prepareStatement

Statement.RETURN_GENERATED_KEYS -> Torna possível posteriormente obter o valor da chave gerada a partir do comando: preparedStatement.getGeneratedKeys();

Statement.CLOSE_ALL_RESULTS -> Qual o resultado de utilizar esta constante como parâmetro do prepareStatement. Seria fechar todos os resultSets vinculados ao preparedStatement, não precisando executar o comando resultSet.close(); ???

Statement.CLOSE_CURRENT_RESULT -> Qual o resultado de utilizar esta constante como parâmetro do prepareStatement. Seria fechar o atual resultSet vinculado ao preparedStatement, não precisando executar o comando resultSet.close(); ???

Statement.EXECUTE_FAILED -> Qual o resultado de utilizar esta constante como parâmetro do prepareStatement; ???

Statement.KEEP_CURRENT_RESULT -> Qual o resultado de utilizar esta constante como parâmetro do prepareStatement; ???

Statement.NO_GENERATED_KEYS -> Qual o resultado de utilizar esta constante como parâmetro do prepareStatement, seria para não incrementar a chave primaria ou simplismente para não disponibilizar o acesso da chave gerada a partir do comando preparedStatement.getGeneratedKeys(); ???;

Statement.SUCCESS_NO_INFO -> Qual o resultado de utilizar esta constante como parâmetro do prepareStatement; ???

5 respostas

Oi Josias, tudo bem?

As constantes Statement.CLOSE_ALL_RESULTS, Statement.CLOSE_CURRENT_RESULT e Statement.KEEP_CURRENT_RESULT são utilizadas quando é retornado mais do que um ResultSet. Quando você quiser obter o próximo ResultSet retornado, você pode fechar todos os ResultSets (CLOSE_ALL_RESULTS ), fechar o ResultSet atual (CLOSE_CURRENT_RESULT) ou manter o ResultSet atual aberto (KEEP_CURRENT_RESULT).

Já as constantes Statement.EXECUTE_FAILED e Statement.SUCCESS_NO_INFO são utilizadas em batch updates. A constante SUCCESS_NO_INFO é retornada quando não é possível saber o número de linhas atualizadas naquele statement. A constante EXECUTE_FAILED é retornada se ocorreu um erro no statement executado.

Por último, a constante Statement.NO_GENERATED_KEYS é o que você falou, é para não disponibilizar o acesso às chaves geradas a partir do método getGeneratedKeys(). Vai retornar um ResultSet vazio caso este método seja chamado.

Abraço!

Olá Joviane!

Referente as constantes Statement.CLOSE_ALL_RESULTS, Statement.CLOSE_CURRENT_RESULT e Statement.KEEP_CURRENT_RESULT , você comentou que elas são utilizadas quando é retornado mais de um ResultSet, não entendi muito bem com relação a retornar mais de um conjunto de dados, o preparedStatementnão retornaria somente um conjunto de dados quando executado a instrução prepareStatement.getResultSet??

tens como exemplificar um exemplo em código de quando é necessário utilizar as constante?

Outra dúvida você comentou que quando usadas Statement.EXECUTE_FAILED e Statement.SUCCESS_NO_INFO essas constantes elas são retornadas, a partir de qual metodo eu teria acesso ao retorno delas?

solução!

Oi Josias,

Você pode ter mais do que um ResultSet retornado caso mande mais de uma query para o preparedStatement, algo como:

PreparedStatement ps = con.prepareStatement("select * from Cliente; select * from Produto");
boolean temResultados = ps.execute();

while(temResultados) {
    ResultSet rs = ps.getResultSet();

    // faz o que tem que fazer com o ResultSet
    // ...

    // aqui você pode passar as constantes Statement.CLOSE_ALL_RESULTS, Statement.CLOSE_CURRENT_RESULT e Statement.KEEP_CURRENT_RESULT)
    temResultados = ps.getMoreResults(Statement.CLOSE_ALL_RESULTS); 
}

No caso das outras duas constantes você pode utilizá-las em conjunto com o retorno do método executeBatch:

int[] quantidadeAtualizada = ps.executeBatch();
for (int i=0; i<quantidadeAtualizada.length; i++) {
    if (quantidadeAtualizada[i] >= 0) {
        System.out.println("Quantidade de registros atualizados="+quantidadeAtualizada[i]);
    }
    else if (quantidadeAtualizada[i] == Statement.SUCCESS_NO_INFO) {
        System.out.println("Não sabemos quantos registros foram atualizados");
    }
    else if (quantidadeAtualizada[i] == Statement.EXECUTE_FAILED) {
        System.out.println("Erro na atualização");
    }
}

Ficou um pouco mais claro? Qualquer coisa avisa aí!

Abraço!

Perfeito Joviane,

Agora ficou claro o funcionamento. :)

Muito interessante a possibilidade de obter vários resultados.

Referente ao comando executeBatch, que no caso é para executar comandos em lote, é recomendado devido a performance, ou tem outro motivo?

Oi Josias!

É isso mesmo, geralmente este comando executeBatch é usado devido a performance mesmo pois ele só vai mandar os sqls para o banco no momento em que for chamado ao invés de mandar sql por sql.

Abraço!