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

Procedimiento almacenado para busqueda

Estas en el tema de Procedimiento almacenado para busqueda en el foro de Mysql en Foros del Web. Hola Foreros. les cuento que llevo algo de tiempo desarrolando con php y mysql, pero ahora estoy emprezando con php poo y mysqli con procedimientos ...
  #1 (permalink)  
Antiguo 13/08/2013, 08:16
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 18 años
Puntos: 0
Procedimiento almacenado para busqueda

Hola Foreros.

les cuento que llevo algo de tiempo desarrolando con php y mysql, pero ahora estoy emprezando con php poo y mysqli con procedimientos almacenados todo bien hasta cuando quise hacer una busqueda.

tengo un formulario de busqueda el cual tiene varios campos
Run,Empresa, Area, Horario, grupodeseguridad,nombre, direccion etc..
quiero hacer busqueda por uno o varios de los campos del formulario, anteriormente yo creaba la consulta validando los campos del formulario en blanco y construyrndo la consulta pero ahora con los procedimientos almacenados no se como hacerlo

Código SQL:
Ver original
  1. CREATE PROCEDURE SpBusUsuario
  2. (
  3.     IN Run VARCHAR(12),
  4.     IN Empresa VARCHAR(12),
  5.     IN Area INT(2),
  6.     IN Nombre VARCHAR(100),
  7.     IN Gps VARCHAR(50),
  8.     IN Region INT(6),
  9.     IN Provincia INT(6),
  10.     IN Comuna INT(6),
  11.     IN TipoHorario INT(10)
  12. )
  13. BEGIN
  14.     SET @consulta =CONCAT('SELECT *
  15.    FROM `Sis_Usuario`
  16.    INNER JOIN Sis_Areas ON Usuario_Area = Areas_Id
  17.    INNER JOIN Sis_Grupo_Seguridad ON Sis_Usuario.GrupoSeguridadCodigo = Sis_Grupo_Seguridad.GrupoSeguridadCodigo
  18.    INNER JOIN Asis_Horario ON UsuarioTipoHorario = Horario_Id
  19.    WHERE `UsuarioRun` = CONVERT(''', Run ,''' using utf8) collate utf8_spanish_ci
  20.    AND `UsuarioEmpresa` = CONVERT(''', Empresa ,''' using utf8) collate utf8_spanish_ci
  21.    AND `Usuario_Area` = CONVERT(''', Area,''' using utf8) collate utf8_spanish_ci
  22.    AND `UsuarioNombre` = CONVERT(''', Nombre ,''' using utf8) collate utf8_spanish_ci
  23.    AND `Sis_Usuario`.`GrupoSeguridadCodigo` =  CONVERT(''',Gps,''' using utf8) collate utf8_spanish_ci
  24.    AND `UsuarioRegion` = CONVERT(''', Region, ''' using utf8) collate utf8_spanish_ci  
  25.    AND `UsuarioCiudad` = CONVERT(''', Provincia, ''' using utf8) collate utf8_spanish_ci
  26.    AND `UsuarioComuna` = CONVERT(''', Comuna , ''' using utf8) collate utf8_spanish_ci
  27.    AND `UsuarioTipoHorario` = CONVERT(''', TipoHorario, ''' using utf8) collate utf8_spanish_ci ');
  28.     PREPARE ejecutar FROM @consulta;
  29.     EXECUTE ejecutar;
  30. END;

si llamo al procedimiento almacenado con todos los campos llenos me realiza la busqueda pero al faltar alguno no

Código SQL:
Ver original
  1. CALL SpBusUsuario('13.899.942-4','76.047.332-4','1','Patricio Carrasco O.','ADMINISTRADOR','13000','13100','13124','1');

hay alguna forma de crear el procedimiento y que al ser llamado verifique cuales valores de laviables estan en blanco u no las considere en la consulta.

me explique bien??
  #2 (permalink)  
Antiguo 13/08/2013, 12:00
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 18 años
Puntos: 0
Respuesta: Procedimiento almacenado para busqueda

Estimados habra una forma mas eficiente de hacer esto....

Código SQL:
Ver original
  1. CREATE PROCEDURE SpTest(IN Run VARCHAR(12),IN Empresa VARCHAR(12))
  2. BEGIN
  3. DECLARE condicion VARCHAR(100);
  4. SET condicion = "";
  5. IF Run <> "" THEN
  6.     IF condicion = " " THEN
  7.         SET condicion = CONCAT(' WHERE UsuarioRun=''', Run,'''');
  8.     ELSE
  9.         SET condicion = CONCAT(' AND  UsuarioRun=''', Run,'''');
  10.     END IF;    
  11. END IF;
  12. IF Empresa <> "" THEN
  13.     IF condicion = " " THEN
  14.         SET condicion = CONCAT(' WHERE UsuarioEmpresa=''', Empresa,'''');
  15.     ELSE
  16.         SET condicion = CONCAT(condicion,' AND UsuarioEmpresa=''', Empresa,'''');
  17.     END IF;    
  18. END IF;
  19. SET @consulta = CONCAT("select * from Sis_Usuario ", condicion);
  20. PREPARE stmt FROM @consulta;
  21. EXECUTE stmt;
  22. END;
  #3 (permalink)  
Antiguo 13/08/2013, 12:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Procedimiento almacenado para busqueda

No. Es siempre la misma.
De hecho, esa misma forma se suele usar desde el lado de programación, por lo que en ´realidad usar SP para esto es una decisión de diseño.
La cosa es simple: Si no validas lo que contiene cada parámetro, no puedes crear la sentencia con los parámetros que efectivamente debe llevar.
__________________
¿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 13/08/2013, 13:04
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 18 años
Puntos: 0
Respuesta: Procedimiento almacenado para busqueda

primero gracias por responder mi duda.

estoy creando el procedimiento se ejecuta bien sin ningun parametro lista todo, probando de a uno cada parametro bien construye la consulta, pero cuando pruebo con varios parametros todo bien hasta el Usuario Nombre

Código SQL:
Ver original
  1. CALL SpBusUsuario('13.899.942-4','76.047.332-4','1','patricio','','','','','');

error 1054 unknown column 'UsuarioNo' in where clause.

no puedo ver el error debe ser alguna comilla del concat pero no lo encuentro ustedes ven que esta mal

Código SQL:
Ver original
  1. CREATE PROCEDURE SpBusUsuario
  2. (
  3.     IN Run VARCHAR(12),
  4.     IN Empresa VARCHAR(12),
  5.     IN Area INT(2),
  6.     IN Nombre VARCHAR(100),
  7.     IN Gps VARCHAR(50),
  8.     IN Region INT(6),
  9.     IN Provincia INT(6),
  10.     IN Comuna INT(6),
  11.     IN TipoHorario INT(10)
  12. )
  13. BEGIN
  14. DECLARE condicion VARCHAR(100);
  15.  
  16. SET condicion = "";
  17.  
  18. IF Run <> "" THEN
  19.     IF condicion <> "" THEN
  20.         SET condicion = CONCAT(' AND  UsuarioRun=''', Run,'''');
  21.     ELSE
  22.         SET condicion = CONCAT(' WHERE UsuarioRun=''', Run,'''');
  23.     END IF;    
  24. END IF;
  25.  
  26. IF Empresa <> "" THEN
  27.     IF condicion <> "" THEN
  28.         SET condicion = CONCAT(condicion,' AND UsuarioEmpresa=''', Empresa,'''');
  29.     ELSE
  30.         SET condicion = CONCAT(' WHERE UsuarioEmpresa=''', Empresa,'''');
  31.     END IF;    
  32. END IF;
  33.  
  34. IF Area <> "" THEN
  35.     IF condicion <> "" THEN
  36.         SET condicion = CONCAT(condicion,' AND UsuarioArea=''', Area,'''');
  37.     ELSE
  38.         SET condicion = CONCAT(' WHERE UsuarioArea=''', Area,'''');
  39.     END IF;    
  40. END IF;
  41. IF Nombre <> "" THEN
  42.     IF condicion <> "" THEN
  43.         SET condicion = CONCAT(condicion,' AND UsuarioNombre LIKE CONVERT(''%', Nombre ,'%'' using utf8) collate utf8_spanish_ci ');
  44.     ELSE
  45.         SET condicion = CONCAT(' WHERE UsuarioNombre LIKE CONVERT(''%', Nombre ,'%'' using utf8) collate utf8_spanish_ci ');
  46.     END IF;    
  47. END IF;
  48. IF Gps <> "" THEN
  49.     IF condicion <> "" THEN
  50.         SET condicion = CONCAT(condicion,' AND Sis_Usuario.GrupoSeguridadCodigo` = ''',Gps,'''');
  51.     ELSE
  52.         SET condicion = CONCAT(' WHERE Sis_Usuario.GrupoSeguridadCodigo =  ''',Gps,''' ');
  53.     END IF;    
  54. END IF;
  55. IF Region <> "" THEN
  56.     IF condicion <> "" THEN
  57.         SET condicion = CONCAT(condicion,' AND `UsuarioRegion` = CONVERT(''', Region, ''' using utf8) collate utf8_spanish_ci  ');
  58.     ELSE
  59.         SET condicion = CONCAT(' WHERE `UsuarioRegion` = CONVERT(''', Region, ''' using utf8) collate utf8_spanish_ci  ');
  60.     END IF;    
  61. END IF;
  62. IF Provincia <> "" THEN
  63.     IF condicion = " " THEN
  64.         SET condicion = CONCAT(condicion,' AND `UsuarioCiudad` = CONVERT(''', Provincia, ''' using utf8) collate utf8_spanish_ci');        
  65.     ELSE
  66.         SET condicion = CONCAT(' WHERE `UsuarioCiudad` = CONVERT(''', Provincia, ''' using utf8) collate utf8_spanish_ci');
  67.     END IF;    
  68. END IF;
  69. IF Comuna <> "" THEN
  70.     IF condicion <> "" THEN
  71.         SET condicion = CONCAT(condicion,' AND `UsuarioComuna` = CONVERT(''', Comuna , ''' using utf8) collate utf8_spanish_ci ');
  72.     ELSE
  73.         SET condicion = CONCAT(' WHERE `UsuarioComuna` = CONVERT(''', Comuna , ''' using utf8) collate utf8_spanish_ci ');
  74.     END IF;    
  75. END IF;
  76. IF TipoHorario <> "" THEN
  77.     IF condicion <> "" THEN
  78.         SET condicion = CONCAT(condicion,' AND `UsuarioTipoHorario` = CONVERT(''', TipoHorario, ''' using utf8) collate utf8_spanish_ci');
  79.     ELSE
  80.         SET condicion = CONCAT(' WHERE `UsuarioTipoHorario` = CONVERT(''', TipoHorario, ''' using utf8) collate utf8_spanish_ci');
  81.     END IF;    
  82. END IF;
  83. SET @consulta = CONCAT("SELECT * FROM `Sis_Usuario` INNER JOIN Sis_Areas ON UsuarioArea = Areas_Id INNER JOIN Sis_Grupo_Seguridad ON Sis_Usuario.GrupoSeguridadCodigo = Sis_Grupo_Seguridad.GrupoSeguridadCodigo INNER JOIN Asis_Horario ON UsuarioTipoHorario = Horario_Id ", condicion);
  84. PREPARE stmt FROM @consulta;
  85. EXECUTE stmt;
  86. END;
  #5 (permalink)  
Antiguo 13/08/2013, 14:35
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 18 años
Puntos: 0
Respuesta: Procedimiento almacenado para busqueda

Amigos ya descubri que era la declaracion de condicion era varchar de largo 100 era muy poco lo cambie a 1000 y listo

Código SQL:
Ver original
  1. CREATE PROCEDURE SpBusUsuario
  2. (
  3.       IN Run VARCHAR(12),
  4.     IN Empresa VARCHAR(12),
  5.     IN Area INT(2),
  6.     IN Nombre VARCHAR(100),
  7.     IN Gps VARCHAR(50),
  8.     IN Region INT(6),
  9.     IN Provincia INT(6),
  10.     IN Comuna INT(6),
  11.     IN TipoHorario INT(10)
  12. )
  13.  
  14. BEGIN
  15.     DECLARE condicion VARCHAR(1000);
  16.     SET condicion ="";
  17.    
  18.     IF Run <> "" THEN
  19.         IF condicion <> "" THEN
  20.         SET condicion = CONCAT(" AND UsuarioRun='",CONVERT(Run USING utf8) COLLATE utf8_spanish_ci ,"' ");
  21.         ELSE
  22.         SET condicion = CONCAT(" WHERE UsuarioRun='",CONVERT(Run USING utf8) COLLATE utf8_spanish_ci ,"' ");
  23.         END IF;
  24.     END IF;
  25.    
  26.     IF Empresa <> "" THEN
  27.         IF condicion <> "" THEN
  28.         SET condicion = CONCAT(condicion, " AND UsuarioEmpresa='",CONVERT(Empresa USING utf8) COLLATE utf8_spanish_ci ,"' ");
  29.         ELSE
  30.         SET condicion = CONCAT(" WHERE UsuarioEmpresa='",CONVERT(Empresa USING utf8) COLLATE utf8_spanish_ci,"' ");
  31.         END IF;
  32.     END IF;
  33.    
  34.     IF Area <> "" THEN
  35.         IF condicion <> "" THEN
  36.         SET condicion = CONCAT(condicion, " AND UsuarioArea='",CONVERT(Area USING utf8) COLLATE utf8_spanish_ci ,"' ");
  37.         ELSE
  38.         SET condicion = CONCAT(" WHERE UsuarioArea='",CONVERT(Area USING utf8) COLLATE utf8_spanish_ci,"' ");
  39.         END IF;
  40.     END IF;
  41.  
  42.     IF Nombre <> "" THEN
  43.         IF condicion <> "" THEN
  44.         SET condicion = CONCAT(condicion, " AND UsuarioNombre LIKE '%", CONVERT(Nombre USING utf8) COLLATE utf8_spanish_ci ,"%' ");
  45.         ELSE
  46.         SET condicion = CONCAT(" WHERE UsuarioNombre LIKE '%", CONVERT(Nombre USING utf8) COLLATE utf8_spanish_ci ,"%' ");
  47.         END IF;
  48.     END IF;
  49.  
  50.     IF Gps <> "" THEN
  51.         IF condicion <> "" THEN
  52.         SET condicion = CONCAT(condicion, " AND Sis_Usuario.GrupoSeguridadCodigo='",CONVERT(Gps USING utf8) COLLATE utf8_spanish_ci ,"' ");
  53.         ELSE
  54.         SET condicion = CONCAT(" WHERE Sis_Usuario.GrupoSeguridadCodigo='",CONVERT(Gps USING utf8) COLLATE utf8_spanish_ci,"' ");
  55.         END IF;
  56.     END IF;
  57.  
  58.     IF Region <> "" THEN
  59.         IF condicion <> "" THEN
  60.         SET condicion = CONCAT(condicion, " AND UsuarioRegion='",CONVERT(Region USING utf8) COLLATE utf8_spanish_ci ,"' ");
  61.         ELSE
  62.         SET condicion = CONCAT(" WHERE UsuarioRegion='",CONVERT(Region USING utf8) COLLATE utf8_spanish_ci,"' ");
  63.         END IF;
  64.     END IF;
  65.  
  66.     IF Provincia <> "" THEN
  67.         IF condicion <> "" THEN
  68.         SET condicion = CONCAT(condicion, " AND UsuarioCiudad='",CONVERT(Provincia USING utf8) COLLATE utf8_spanish_ci ,"' ");
  69.         ELSE
  70.         SET condicion = CONCAT(" WHERE UsuarioCiudad='",CONVERT(Provincia USING utf8) COLLATE utf8_spanish_ci,"' ");
  71.         END IF;
  72.     END IF;
  73.  
  74.     IF Comuna <> "" THEN
  75.         IF condicion <> "" THEN
  76.         SET condicion = CONCAT(condicion, " AND UsuarioComuna='",CONVERT(Comuna USING utf8) COLLATE utf8_spanish_ci ,"' ");
  77.         ELSE
  78.         SET condicion = CONCAT(" WHERE UsuarioComuna='",CONVERT(Comuna USING utf8) COLLATE utf8_spanish_ci,"' ");
  79.         END IF;
  80.     END IF;
  81.  
  82.     IF TipoHorario <> "" THEN
  83.         IF condicion <> "" THEN
  84.         SET condicion = CONCAT(condicion, " AND UsuarioTipoHorario='",CONVERT(TipoHorario USING utf8) COLLATE utf8_spanish_ci ,"' ");
  85.         ELSE
  86.         SET condicion = CONCAT(" WHERE UsuarioTipoHorario='",CONVERT(TipoHorario USING utf8) COLLATE utf8_spanish_ci,"' ");
  87.         END IF;
  88.     END IF;
  89.  
  90. SET @consulta = CONCAT("SELECT * FROM Sis_Usuario INNER JOIN Sis_Areas ON UsuarioArea = Areas_Id INNER JOIN Sis_Grupo_Seguridad ON Sis_Usuario.GrupoSeguridadCodigo = Sis_Grupo_Seguridad.GrupoSeguridadCodigo INNER JOIN Asis_Horario ON UsuarioTipoHorario = Horario_Id ", condicion);
  91. PREPARE stmt FROM @consulta;
  92. EXECUTE stmt;
  93. END;

Etiquetas: almacenado, busqueda, campo, join, php, procedimiento, select, sql
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 08:15.