Dúvida com PreparedStatement  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Luiz Henrique Coura
Java Ninja
[Avatar]

Membro desde: 28/04/2004 21:03:05
Mensagens: 283
Localização: Lorena-SP
Offline

ae Pessoal!

Estou utilizando PreparedStatement para fazer minhas queries no banco, porém eu preciso fazer uma query um pouco mais "inteligente".

Tenho umas tabelas no banco q tem praticamente a mesma estrutura onde a única coisa de diferente é o nome.

Como eu faço, se tiver como, para fazer uma query utilizando essa estrutura?



Reparem q o nome da tabela eu tb mascarei.

Valew!

"A única pergunta estúpida é aquela que você nunca faz"
Anônimo

Luiz Henrique Coura
[MSN]
ZehOliveira
GUJ Ranger

Membro desde: 12/12/2003 22:13:49
Mensagens: 964
Localização: Maceio-AL
Offline

Não sei se alguém aqui tem alguma carta na manga pra esse tipo de coisa. Mas eu sempre fiz "na mão" mesmo esse tipo de coisa, e não vejo outro modo de fazer.

Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Luiz Henrique Coura wrote:ae Pessoal!

Estou utilizando PreparedStatement para fazer minhas queries no banco, porém eu preciso fazer uma query um pouco mais "inteligente".

Tenho umas tabelas no banco q tem praticamente a mesma estrutura onde a única coisa de diferente é o nome.

Como eu faço, se tiver como, para fazer uma query utilizando essa estrutura?



Reparem q o nome da tabela eu tb mascarei.

Valew!


Você já tentou isso e não funcionou?

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
ZehOliveira
GUJ Ranger

Membro desde: 12/12/2003 22:13:49
Mensagens: 964
Localização: Maceio-AL
Offline

Com certeza isso não funciona, Maurício.

Até pela própria natureza de bind variables, que são usadas para que o banco de dados mantenha um plano de acesso para consultas iguais com parametros diferentes.

É impossível (pelo menos no meu entendimento da coisa) bindar o nome de uma tabela.
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Eu sei lá como é que o driver JDBC faz isso, quem sabe num funciona, só sabe tentando

This message was edited 1 time. Last update was at 24/06/2005 14:28:11


Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
Luiz Henrique Coura
Java Ninja
[Avatar]

Membro desde: 28/04/2004 21:03:05
Mensagens: 283
Localização: Lorena-SP
Offline

São parâmetros q vem direto da linha de comando. Preciso deixar isso bem protegido. O usuário vai passar os parâmetros e os resultados serão armazenados em arquivos.

Qd tento isso direto, ele acusa erro:


Esse é o trecho do código:



This message was edited 1 time. Last update was at 24/06/2005 14:37:11


"A única pergunta estúpida é aquela que você nunca faz"
Anônimo

Luiz Henrique Coura
[MSN]
ZehOliveira
GUJ Ranger

Membro desde: 12/12/2003 22:13:49
Mensagens: 964
Localização: Maceio-AL
Offline

Quem vai reclamar não é driver JDBC, até pq ele não tem inteligência pra dizer se a query tá certa ou errada. Quem vai reclamar é o banco de dados mesmo, dizendo que não pode bindar (alguém tem uma tradução melhor pra isso?) a variável.

No Oracle eu sei que não funciona. Pode ser que em outros SGDBs, que não usem bind variables, funcione. Enfim...
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Ah é, quando ele vê que o objeto é um string ele dá um setString e faz o escape do String. Bem que o ZehOliveira falou

Mas se você souber o nome de todas as tabelas que são assim, ou pelo menos tiver como saber o nome de todas elas quando a aplicação iniciar, inicializa todos os prepared statements e mantém um Map ou uma collection qualquer com eles, assim quando você precisar, é só ir lá no map e pegar denovo

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
Kleber Santos
JavaChild
[Avatar]

Membro desde: 17/06/2005 12:05:13
Mensagens: 116
Localização: Guarulhos - São Paulo
Offline

SELECT * FROM ? WHERE status=?


não seria algo assim?

SELECT ? FROM ? WHERE ?

onde "?" seriam parametros a passar?


Ateu, Graças a Deus.
[MSN] [ICQ]
ZehOliveira
GUJ Ranger

Membro desde: 12/12/2003 22:13:49
Mensagens: 964
Localização: Maceio-AL
Offline

Qd tento isso direto, ele acusa erro:

Acho que o MySQL se encaixa no exemplo de SGDBs que eu citei acima.

Quando você faz:

Ao invés de ser gerado: "SELECT *FROM tabela ..."
Ele gera: "SELECT * FROM 'tabela' ..."

(Veja bem, isso no caso do driver do MySQL. Pode ser que ele passasse as consulta com ? para o banco e deixasse o trabalho de bindagem com o banco de dados.)

Creio que o erro venha daí. Mas, nome de tabela não é pra ser passado como bind variable, mas sim como literal. Você deve fornecer uma query válida já com o nome da tabela e setar somente as variáveis.

Continuo batendo na tecla de fazer na mão. Tomando as devidas precauções, já que o dado vem de uma fonte não confiável (usuário).

This message was edited 3 times. Last update was at 24/06/2005 14:44:12

Luiz Henrique Coura
Java Ninja
[Avatar]

Membro desde: 28/04/2004 21:03:05
Mensagens: 283
Localização: Lorena-SP
Offline

Utilizo MySQL e ele acusou esse erro.

Pensei nessa solução do Maurício. O problema é q terei q ficar adicionando uma query nova para cada tabela nova q entrar.

Estou pensando em fazer filtrar os parâmetros passados pelo o usuário.

Zeh, gostaria de ler mais sobre bind variables, enfim, sobre essa característica do banco. Onde consigo encontrar?

"A única pergunta estúpida é aquela que você nunca faz"
Anônimo

Luiz Henrique Coura
[MSN]
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Luiz Henrique Coura wrote:Utilizo MySQL e ele acusou esse erro.

Pensei nessa solução do Maurício. O problema é q terei q ficar adicionando uma query nova para cada tabela nova q entrar.

Estou pensando em fazer filtrar os parâmetros passados pelo o usuário.

Zeh, gostaria de ler mais sobre bind variables, enfim, sobre essa característica do banco. Onde consigo encontrar?


Use Hibernate
Use Hibernate
Use Hibernate
Use Hibernate
Use Hibernate

E bind variables é o que você faz quando dá um setQualquerCoisa() num prepared statement, você está "ligando" ou "posicionando" variáveis dentro da sua query.

Mas...

Use Hibernate
Use Hibernate
Use Hibernate

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
Kleber Santos
JavaChild
[Avatar]

Membro desde: 17/06/2005 12:05:13
Mensagens: 116
Localização: Guarulhos - São Paulo
Offline

Tomando as devidas precauções, já que o dado vem de uma fonte não confiável (usuário)


ZehOliveira, mas vc conseguiu resolver? e isso?

Ateu, Graças a Deus.
[MSN] [ICQ]
Kleber Santos
JavaChild
[Avatar]

Membro desde: 17/06/2005 12:05:13
Mensagens: 116
Localização: Guarulhos - São Paulo
Offline

desculpa, não é ZehOliveira

Luiz Henrique Coura

Ateu, Graças a Deus.
[MSN] [ICQ]
ZehOliveira
GUJ Ranger

Membro desde: 12/12/2003 22:13:49
Mensagens: 964
Localização: Maceio-AL
Offline

Estou pensando em fazer filtrar os parâmetros passados pelo o usuário.

Seja simples. Do it.

Zeh, gostaria de ler mais sobre bind variables, enfim, sobre essa característica do banco. Onde consigo encontrar?

Um link interessante sobre o assunto é http://www.mhavila.com.br/topicos/bd/sqlbind.html

Procurando por bind variables no Google você vai achar muita, muita coisa mesmo!

 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team