Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-07-2004
Avatar de Tino
Tino Tino is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Tino Va por buen camino
Construcción dinámica de SQLs. ¿Qué es mejor?

Hola al foro.

Tengo interés en saber vuestra opinión sobre 2 maneras de realizar consultas SQL dinámicas que conozco y que quiero decantarme por una de ellas.

Yo, y en contra de lo que suelo ver, genero el texto SQL así:

Código:
 
const
  SQLSelect1 = 'SELECT CAMPO FROM TABLA WHERE CAMPO1= %d AND CAMPO2=''%s''';
begin
  with TSQLQuery.Create do 
	 ....
	 SQL.Text := Format(SQLSelect1, [p1, p2]);
	 Open;
	 ....
end;
Otra posible manera, sería:

Código:
 
const
  SQLSelect1 = 'SELECT CAMPO FROM TABLA WHERE CAMPO1= :param1 AND CAMPO2=:param2';
begin
  with TSQLQuery.Create do 
	 ....
	 SQL.Text := SQLSelect1;
	 Params[0].AsInteger := v1;
	 Params[1].AsString := v2;
	 Open;
	 ....
end;
Es decir, la 1a. manera emplea la función Format y la 2a. manera genera parámetros al vuelo.

¿Qué es mejor? ¿Hay una mejor alternativa en generar SQL dinámicamente?

Saludos.

Última edición por Tino fecha: 12-07-2004 a las 21:31:22.
Responder Con Cita
  #2  
Antiguo 12-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
De estas opciones, sin lugar a dudas, la mas óptima y portable es la segunda.
Por ejemplo, en Oracle, las consultas SQL se guardan momentaneamente compiladas en el "shared pool". Al momento de ejecutar una nueva consulta, busca si ya tenía parseado+compilado este código en este cache, si lo enecuentra lo ejecuta evitándose ejecutar los pasos recien nombrados lo que acelera notablemente la ejecución. Si las consultas fueron definidas con "Bind Paramenters" (los parámetros de Delphi), podrá encontrar la misma consulta en el "sared pool" si la consulta fue definida con parámetros estáticos entonces para el motor se trata de diferentes consultas.
Por otro lado, usar parámetros hace que nuestro código sea fácilmente portable a diferentes motores de bases de datos, siempre que respetemos el ANSI SQL.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 12-07-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
Solo añadir que otra desventaja de utilizar la primera opcion es que provoca un agujero de seguridad ya que permite utilizar ataques de inyeccion de SQL, que podrian permitir a un usuario malicioso acceder a datos que en teoria no deberia
poder ver o en el peor de los casos incluso borrar tablas enteras.

Saludos
Miguel
Responder Con Cita
  #4  
Antiguo 12-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por Mick
Solo añadir que otra desventaja de utilizar la primera opcion es que provoca un agujero de seguridad ya que permite utilizar ataques de inyeccion de SQL, que podrian permitir a un usuario malicioso acceder a datos que en teoria no deberia poder ver o en el peor de los casos incluso borrar tablas enteras.
Creo que en los dos casos estas expuesto a situaciones de esa índole.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 13-07-2004
Avatar de Tino
Tino Tino is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Tino Va por buen camino
Una respuesta aclaradora

Gracias por la respuesta, aunque no entiendo porque la 1a. manera no es tan SQL estándar como la 2a. Yo la veo igual en ese sentido. ¿Las comillas quizás?

Lo del shared pool si que es un detalle muy revelador y que voy a tener en cuenta. Gracias.

Sin embargo, se me ocurre un caso real en que igual es recomendable la 1a. manera o incluso una mezcla de ambas. Si el número de condiciones o de tablas o de columnas es variable, la función Format nos puede echar una mano para formar la cadena de texto SQL final.

Creo que lo mejor entonces es emplear la 1a. manera cuando el texto se vuelve demasiado variable y emplear bind parameters para aprovechar su eficiencia. En los casos más sencillos usar la 2a. ¿Qué decís?




Un saludo.
Responder Con Cita
  #6  
Antiguo 13-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por Tino
...no entiendo porque la 1a. manera no es tan SQL estándar como la 2a...
Simplemente intenta pasar una fecha a dos motores de la primer manera, vas a tener que darle un formato o utilizar una alguna función no ANSI específica de cada motor, con el uso de parámetros simplemente te olvidas de ese problema.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:03:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi