Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Ayuda con consulta

Estas en el tema de Ayuda con consulta en el foro de Bases de Datos General en Foros del Web. Hola. quiero pedir ayuda ya que el problema que tengo es que quiero hacer una consulta o procedimiento almacenado por ejemplo: select * from productos ...
  #1 (permalink)  
Antiguo 06/11/2008, 15:57
 
Fecha de Ingreso: octubre-2008
Mensajes: 25
Antigüedad: 15 años, 6 meses
Puntos: 0
Ayuda con consulta

Hola. quiero pedir ayuda ya que el problema que tengo es que quiero hacer una consulta o procedimiento almacenado por ejemplo: select * from productos order by precio. y quiero poner un parametro en precio para que asi pueda escojer la opcion por la cual quiero ordenar, por ejemplo por precio o nombre. Bueno espero haberme dado a entender gracias por la ayuda.
  #2 (permalink)  
Antiguo 07/11/2008, 22:46
 
Fecha de Ingreso: mayo-2005
Mensajes: 63
Antigüedad: 19 años
Puntos: 1
Respuesta: Ayuda con consulta

CREATE PROCEDURE [dbo].[OrdenaXCriterio]
@filtro varchar(100)
AS

BEGIN
declare @strSQL varchar(1000)
SET @strSQL='SELECT * FROM nombre_TABLA ORDER BY ' + @filtro

exec (@strSQL)

END



y para que lo llames seria OrdenaXCriterio 'campo_a_ordenar'
  #3 (permalink)  
Antiguo 08/11/2008, 13:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda con consulta

Dos cosas:
- No estás diciendo que motor de base de datos estás usando. LA sintaxis y la forma de llamado de los SP cambia según qué DBMS uses.
- Usar un SP para realizar un simple select es un desperdicio de recursos. En realidad si lo haces desde una aplicación es muchísimo más fácil realizar un query directamente y parametrizarlo en la función que lo crea en la aplicación.
El sentido de los SP es ejecutar un conjunto de operaciones de SQL como una sola y tomar decisiones según los resultados y/o valores obtenidos ante determinadas condiciones. POr caso, yo tengo SP que en un solo conjunto, crean sentencias dinámicamente, seleccionan el caso/resultado, crean tablas temporales, las procesan, recogen datos, los almacenan en otras tablas, destruyen tablas y devuelven conjunto de datos... todo en una sola operación. Allí sí tiene sentido hacer un SP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 10/11/2008, 13:51
 
Fecha de Ingreso: octubre-2008
Mensajes: 25
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Ayuda con consulta

Bueno para aclaracion estoy usando mysql, y una disculpa por no poner el tipo de SGBD, y gracias por las repuestas anteriores.
  #5 (permalink)  
Antiguo 10/11/2008, 19:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda con consulta

Bueno, por lo que dices, el SGBD que estás usando es MySQL (aunque muchos duden, es por definición un DBMS).

En segundo lugar, el problema, tal y como lo planteas, es mucho más simple de realizar desde una consulta construida en la aplicación y simplemente ejecutada en la base de datos.
Esto es porque el proceso, si bien se puede hacer en un SP, es un poquito complejo y con algunos problemas...
Partiendo de la base que un motor de base de datos no programa selecciones en pantalla, sino que responde a consultas, lo que te conviene hacer es simplemente preparar el formulario para realizar la selección del criterio de reordenamiento, y colocar el campo en cuestión en el final del string de la consulta.
Código sql:
Ver original
  1. SELECT *
  2. FROM TABLA
  3. ORDER BY nombre_campo_agregado_por_codigo;

Si aún así quieres hacerlo en un SP, hay dos formas básicas:
1. Construir un conjunto de selección por parámetros numéricos:
Código sql:
Ver original
  1. CASE opcion
  2. WHEN opcion = 1 THEN
  3. ...
  4. WHEN opcion = 2 THEN
  5. ...
  6. WHEN opcion = 3 THEN
  7. ...
  8. WHEN opcion = 4 THEN
  9. ...
  10. ELSE
  11. ...
  12. END CASE;
Donde en cada segmento ejecutarías un ordenamiento diferente. El parámetro opcion debería ser, entonces, el parámetro ingresado al SP.

2) Parametrizar la entrada permitiendo que ingrese en una variable VARCHAR un string conteniendo el/los campos de ordenamiento.
Esto implica:
- Crear el procedure parametrizado.
- Cargar una variable de tipo user con una sentencia.
- Crear una sentencia preparada sobre la base de la variable.
- Ejecutar la sentencia preparada contra una tabla temporal.
- Dropear la sentencia preparada.
- Ejecutar un select contra la tabla temporal.

El problema que yo me he encontrado es que pasar como parámetro un string conteniendo un conjunto de campos es bastante complicado de calibrar. No es un método que recomendaría para empezar a bucear en los SP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 13/11/2008, 15:54
 
Fecha de Ingreso: octubre-2008
Mensajes: 25
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Ayuda con consulta

Disculpen que sea tan molesta pero quisiera saber como seria el procedimiento que publico davhira pero en mysql.

gracias.
  #7 (permalink)  
Antiguo 13/11/2008, 16:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda con consulta

Cita:
Iniciado por sand1229 Ver Mensaje
Disculpen que sea tan molesta pero quisiera saber como seria el procedimiento que publico davhira pero en mysql.

gracias.
Sería exactamente como lo describo arriba. El modelo descrito es de MySQL.
El problema central es que no es práctico (ni en MySQL ni en otro DBMS) manejar esa parametrización en un SP.
Por caso, te posteo aquí un caso de SP con parámetros y resolución de valores según el caso:
Código sql:
Ver original
  1. CREATE PROCEDURE `VALIDARVIAJES`(
  2.    IN VPATENTE CHAR(12),
  3.    IN VFECHAINI DATE,
  4.    IN VHORAINI TIME,
  5.    OUT VIDVIAJE INT)
  6. BEGIN
  7.    DECLARE BUSCADO INT DEFAULT 0;
  8.    DECLARE ESTADO INT DEFAULT 0;
  9.    DECLARE VFINI DATE;
  10.    DECLARE VHINI TIME;
  11.    -- Buscar si hay alguno con los datos completos
  12.    SELECT IDVIAJE, VIAJECOMPLETO, FECHAINICIO, HORAINICIO
  13.    FROM VIAJE
  14.    WHERE PATENTE=VPATENTE
  15.      AND FECHAINICIO=VFECHAINI
  16.      AND HORAINICIO=VHORAINI
  17.    INTO BUSCADO, ESTADO, VFINI, VHINI;
  18.    IF BUSCADO IS NULL THEN
  19.      CASE
  20.        WHEN ESTADO=1 THEN
  21.          SELECT * FROM VIAJE WHERE IDVIAJE = BUSCADO;
  22.        WHEN ESTADO=2 THEN
  23.          DELETE FROM VIAJE WHERE IDVIAJE = BUSCADO;
  24.        WHEN ESTADO=3 THEN
  25.          UPDATE VIAJE SET VIALECOMPLETO=1 WHERE IDVIAJE = BUSCADO;
  26.        WHEN ESTADO=4 THEN
  27.          SET VIDVIAJE=-1;
  28.        ELSE
  29.          SET VIDVIAJE=0;
  30.      END CASE;
  31.    ELSE
  32.      SET VIDVIAJE=0;
  33.    END IF;
  34.  END

Algo así sería en teoría generar un case par aun SP parametrizado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 14/11/2008, 10:32
 
Fecha de Ingreso: octubre-2008
Mensajes: 25
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Ayuda con consulta

Hola gnzsoloyo te agradezco mucho tu respuesta. y diculpen por las molestias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:22.