Pegar instrução SQL que foi rodada no banco (sem os ?)

Bom dia… Fazendo um update no banco de dados usando PreparedStatement. Normalmente faço assim:

String sql = "UPDATE TABELA SET CAMPO_1 = ?, CAMPO_2 = ?, CAMPO_3 = ?, .. , CAMPO_N = ?";
PreparedStatement stmt = conexao.prepareStatement(sql);
stmt.setString(1, param_1);
stmt.setString(2, param_2);
stmt.setString(3, param_3);
..
stmt.setString(n, param_n);
stmt.execute();
stmt.close();

Muitas vezes eu preciso saber como ficou minha instrução SQL sem os “?”. Tentei pegar usando conexao.nativeSQL(sql) mas ele ainda retorna “UPDATE TABELA SET CAMPO_1 = ?, CAMPO_2 = ?, CAMPO_3 = ?, … , CAMPO_N = ?”.

Existe uma forma de eu fazer que ele traga os valores na instrução? Por exemplo:
“UPDATE TABELA SET CAMPO_1 = ‘valor_1’, CAMPO_2 = ‘valor_2’, CAMPO_3 = ‘valor_3’, … , CAMPO_N = ‘valor_n’”

Obrigado!

Olá libajunior.

Você precisa apenas visualizar a String do sql depois de formada? Ou capturá-la para poder registrar?

Debugando eu sei que você consegue ver, portanto acredito que tenha como capturá-la também, não tenho nenhum projeto com JDBC aqui mas a noite em casa posso verificar e respondo aqui novamente.

Bom dia Frederico, obrigado pela atenção…

Eu preciso capturá-la para jogar num arquivo de log específico. Se puderes fazer o teste eu te agradeço…

=)

Vou tentando tbm para ver se consigo de alguma forma pegar tbm

obrigado

Usando o Debug não é suficiente para você pegar os valores não?

Não tenho certeza, mas acho que o bind das variáveis é feita dentro do banco de dados. Isso é feito para melhorar o desempenho, compilando o sql apenas uma vez e registrando só as variáveis para executar. Ao invés de “?”, por que não usa o padrão :NOME_VARIAVEL? Assim você sabe onde vai cada valor e registra o sql na mão mesmo.

Em tempos usei o P6Spy.