Thread View: uch.ing.dcc
4 messages
4 total messages
Started by Manuel Villarroel
Mon, 30 Jan 2006 18:02
Pregunta JDBC (PreparedStatement)
Author: Manuel Villarroel
Date: Mon, 30 Jan 2006 18:02
Date: Mon, 30 Jan 2006 18:02
148 lines
6762 bytes
6762 bytes
This is a multi-part message in MIME format.
------=_NextPart_000_0017_01C625AE.2B5907B0
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Estimados:
Alguien sabe si en una consulta se puede parametrizar el nombre de la =
tabla o de los campos
usando java.sql.PreparedStatement?
Ejemplo pseudo java :=20
/* 'con' es una conexion activa*/
String query =3D "Select * from ? where id =3D ?";
PreparedStatement ps =3D con.prepareStatement(query);
...
if(algo){
ps.setString(1, "tabla1");
ps.setInt(2, 1);
}
else{
ps.setString(1,"tabla2");
ps.setInt(2,1);
}
ps.executeQuery();
...
Mirando las consultas que se originan (utilizando el metodo toString() =
de PreparedStatement), en=20
la consulta generada aparecen quotes encerrando el nombre de la tabla, =
produciendo consultas
inv=E1lidas. He probado usando varios de los setters de =
PreparedStatement, pero siempre coloca los quotes.
Select * from 'tabla1' where id =3D 1
Select * from 'tabla2' where id =3D 1
ERROR: syntax error at or near "'table1'" at character 16
LINE 1: Select * from 'tabla1' where id =3D 1
Dado que el codigo entre los puntos suspensivos se ejecuta dentro de un =
ciclo,lo que quiero evitar=20
es reemplazar, concatenar strings para generar una consulta, que mas =
encima se compilara cada vez.
(Aunque no estoy muy seguro de c=F3mo funciona exactamente =
PreparedStatement en ese sentido)
Por si acaso, estoy usando PostgreSQL 8.0
Alguna sugerencia?
--
Saludos,=20
Manuel Villarroel R.
------=_NextPart_000_0017_01C625AE.2B5907B0
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2900.2802" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Estimados:</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>Alguien sabe si en una consulta se =
puede=20
parametrizar el nombre de la tabla o de los campos</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>usando =
java.sql.PreparedStatement?</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>Ejemplo pseudo java : </FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>/* 'con' es una conexion =
activa*/</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>String query =3D "Select * from ? where =
id =3D=20
?";</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>PreparedStatement ps =3D=20
con.prepareStatement(query);</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>...</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>if(algo){</FONT></DIV>
<DIV><FONT face=3DArial size=3D2> ps.setString(1,=20
"tabla1");</FONT></DIV>
<DIV><FONT face=3DArial size=3D2> ps.setInt(2, =
1);</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>}</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>else{</FONT></DIV>
<DIV><FONT face=3DArial size=3D2> =20
ps.setString(1,"tabla2");</FONT></DIV>
<DIV><FONT face=3DArial size=3D2> =
ps.setInt(2,1);</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>}</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>ps.executeQuery();</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>...</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>Mirando las consultas que se originan =
(utilizando=20
el metodo toString() de PreparedStatement), en </FONT></DIV>
<DIV><FONT face=3DArial size=3D2>la consulta generada aparecen quotes =
encerrando el=20
nombre de la tabla, produciendo consultas</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>inv=E1lidas. He probado usando varios =
de los setters=20
de PreparedStatement, pero siempre coloca los quotes.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>
<DIV><FONT face=3DArial size=3D2>Select * from 'tabla1' where id =3D =
1</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Select * from 'tabla2' where id =3D =
1</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>ERROR: syntax error at or near =
"'table1'" at=20
character 16<BR>LINE 1: <FONT face=3DArial size=3D2>Select * from =
'tabla1' where id=20
=3D 1</FONT></FONT></DIV>
<DIV> </DIV></FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Dado que el codigo entre los puntos =
suspensivos se=20
ejecuta dentro de un ciclo,lo que quiero evitar </FONT></DIV>
<DIV><FONT face=3DArial size=3D2>es reemplazar, concatenar strings para =
generar una=20
consulta, que mas encima se compilara cada vez.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>(Aunque no estoy muy seguro de c=F3mo =
funciona=20
exactamente PreparedStatement en ese sentido)</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Por si acaso, estoy usando PostgreSQL=20
8.0</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2></FONT> </DIV>
<DIV><FONT face=3DArial size=3D2>Alguna sugerencia?</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=3DArial size=3D2>--<BR>Saludos, <BR>Manuel Villarroel=20
R.</FONT></DIV></BODY></HTML>
------=_NextPart_000_0017_01C625AE.2B5907B0--
Re: Pregunta JDBC (PreparedStatement)
Author: Rodolfo Toledo
Date: Mon, 30 Jan 2006 18:19
Date: Mon, 30 Jan 2006 18:19
21 lines
1938 bytes
1938 bytes
Manuel Villarroel wrote: > Estimados: > [snip] > > Dado que el codigo entre los puntos suspensivos se ejecuta dentro de un > ciclo,lo que quiero evitar > es reemplazar, concatenar strings para generar una consulta, que mas > encima se compilara cada vez. Lo de concatenar Strings en un ciclo es lo de menos si estas realizando una consulta a la base de datos ya que los tiempos no son comparables. Ademas, si PreparedStatement soportara lo que quieres (yo diria que no), igual se compilaria la consulta cada vez. Con respecto a una solucion, si son pocas tablas (ie. consultas distintas), puedes crear tantos PreparedStatements como necesites. Asi evitas el que se compile una misma consulta mas de una vez. Saludos, Rodolfo Toledo.
Re: Pregunta JDBC (PreparedStatement)
Author: Manuel Villarroel
Date: Mon, 30 Jan 2006 19:18
Date: Mon, 30 Jan 2006 19:18
24 lines
2173 bytes
2173 bytes
Gracias! "Rodolfo Toledo" <rtoledo@[dcc.uchile.cl|gmail.com]> escribi� en el mensaje news:drll85$d6i$1@helcaraxe.dcc.uchile.cl... > Manuel Villarroel wrote: >> Estimados: >> [snip] >> Dado que el codigo entre los puntos suspensivos se ejecuta dentro de un ciclo,lo que quiero >> evitar >> es reemplazar, concatenar strings para generar una consulta, que mas encima se compilara cada >> vez. > > Lo de concatenar Strings en un ciclo es lo de menos si estas realizando una consulta a la base de > datos ya que los tiempos no son comparables. > > Ademas, si PreparedStatement soportara lo que quieres (yo diria que no), igual se compilaria la > consulta cada vez. > > Con respecto a una solucion, si son pocas tablas (ie. consultas distintas), puedes crear tantos > PreparedStatements como necesites. Asi evitas el que se compile una misma consulta mas de una > vez. > > Saludos, > Rodolfo Toledo.
Re: Pregunta JDBC (PreparedStatement)
Author: Luis León Cárdenas Graide
Date: Mon, 06 Feb 2006 15:36
Date: Mon, 06 Feb 2006 15:36
23 lines
2286 bytes
2286 bytes
On Mon, 30 Jan 2006, Manuel Villarroel wrote: > Estimados: > > Alguien sabe si en una consulta se puede parametrizar el nombre de la tabla o de los campos > usando java.sql.PreparedStatement? 1) Depende del driver. El est�ndar no lo soporta. S�lo soporta "constantes". Algunos drivers "bakanes" soportan parametrizar tablas y columnas, pero son extensiones propietarias. 2) Recomendaci�n: si est�s parametrizando tablas, ten un HashMap que map�e el String con el nombre de la tabla al PreparedStatement correspondiente. 3) �Concatenar Strings para crear una query SQL? Es factible, pero mucho ojo con no abrir por debajo una vulnerabilidad SQL Injection. 4) Para desacoplar la aplicaci�n del manejo de la BD, te sugiero usar procedimientos almacenados (en un motor que los soporte decentemente, como Postgres, no MySQL) a los que les pases por par�metro el nombre de la tabla y armas el SQL din�mico dentro de �l. Esa invocaci�n s� podr�as hacerla con un PreparedStatement parametrizado en forma est�ndar, con los "?" en los valores constantes y no en el nombre de tabla o columna.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads