Retornar SQL de um PreparedStatement

10 respostas
erico_kl

Bom dia, amigos…
Minha dúvida é a seguinte… preciso recuperar a SQL a partir de um PreparedStatement ou de uma Connection.
Ex.: tenho todas minhas SQLs neste padrão:

e depois faço o seguinte:

ppst.setString (1, "%A%"); ppst.setInt (2, 50);
tem alguma forma de, após setar os valores, eu recuperar a seguinte SQL?:

preciso dessa SQL pois ela é passada como parâmetro para um subrelatório
Obs.: Por um motivo um pouco complicado de explicar, não me adiantaria passar um DataSource ao invés de uma SQL para o subrelatório… eu preciso da query mesmo…

Desde já, agradeço a ajuda…

10 Respostas

zoren

Você pode tentar com um toString, mas a query vem zuada

ou sobrescreve a classe do PreparedStatement e reescreve o método toString para retornar apenas o SQL

acho que não tem outro jeito de pegar a query dele, pelo menos eu desconheço.

erico_kl

obrigado zoren…
fiz uns testes com o toString() e o único detalhe que eu tenho que ajeitar é na hora de passar o parâmetro… pois como a SQL vai ser executada fora do PreparedStatement eu preciso fazer o seguinte:

e dessa forma (com os apóstrofos) ele me retorna a query certo…
não cheguei a fazer testes com SQLs mais complexas… mas acredito que a única alteração seja na hora de passar o parâmetro mesmo…
você teria algum exemplo onde a SQL poderia vir mais zuada utilizando toString()?
obrigado mais uma vez…

zoren

Eu não lembro direito, mas ele mostrava o nome da classe@query

vc não pode passar para o PreparedStatement os apostrofos, ele vai dar erro;

erico_kl

vai dar erro se eu tentar executar a SQL a partir do PreparedStatement e não na hora de setar o valor…
neste caso em específico, eu só preciso da PreparedStatement pra dar os replaces nos ? e então jogar a query para o subrelatório… tanto que eu poderia fazer esses replaces no braço… mas aí é gambiarra

zoren

se vc n executar o prepared statement, não haverá problemas qto o apostrofo.

mas acho q isso é mais gambi que fazer replace

erico_kl

por que?
utilizando o ppst eu resolvo em pouquíssimas linhas e se eu der os replaces no braço eu teria que fazer uma classe que controle isso (quantidade de interrogações, tipos de cada valor, ordem dos replaces…)
eu preciso da SQL só pra mandar para o subrelatório, e ela é executada lá…

zoren

não precisa fazer uma classe, é só usar StringFormat.

vc passa os parâmetros e ele troca pra vc.

ou

String texto = "Mensagem: param1";

System.out.println(texto.replace("param1", "Hello World!!!"));
erico_kl

sim, eu dei um exemplo… mas então… e no caso de vários pontos de interrogação?
e por quê fazer isso na mão se o PreparedStatement já faz?

zoren

ele faz, mas junto coisa que vc não precisa junto

tipo o @12312432

pelo menos trazia na ultima vez que eu fiz isso

erico_kl

mas eu testei e a sql voltou normal… tanto que passei para o subrelatório e gerou certo (inclusive já com os parâmetros definidos pelo usuário)

Criado 11 de maio de 2010
Ultima resposta 11 de mai. de 2010
Respostas 10
Participantes 2