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

Prepare - Execute en SP

Estas en el tema de Prepare - Execute en SP en el foro de Mysql en Foros del Web. Hola, tengo un pequeño problema con mi siguiente Stored Procedure. El siguiente codigo funciona bien, pero no se que tanto; quisiera que se reconozcan los ...
  #1 (permalink)  
Antiguo 06/05/2010, 11:55
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Prepare - Execute en SP

Hola, tengo un pequeño problema con mi siguiente Stored Procedure.
El siguiente codigo funciona bien, pero no se que tanto; quisiera que se reconozcan los parametros de entrada del SP en el string, por ahora con ? reconoce los parametros pero no se como sabe cual es cual, a pesar de eso funciona bien.

Mi otra consulta es que quisiera partir mi string en 2, es decir tener @consulta1 + @consulta2 pero no me ha funcionado, saben como podria hacerlo?

Muchas gracias por su tiempo.

Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`%` PROCEDURE `sp_1test`(in param_cod_sistema char(2), in param_cod_actividad char(10))
  2.         set @consulta='select cod_actividad, des_actividad, des_formulario from actividad where actividad.cod_sistema=? and actividad.cod_actividad=?';
  3.         set @param_cod_sistema=param_cod_sistema;
  4.         set @param_cod_actividad=param_cod_actividad;
  5.  
  6.         prepare consulta from @consulta;
  7.         execute consulta using @param_cod_sistema, @param_cod_actividad;
  8.         deallocate prepare consulta;
  #2 (permalink)  
Antiguo 06/05/2010, 12:02
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: Prepare - Execute en SP

Cita:
reconoce los parametros pero no se como sabe cual es cual
Hasta lo que sé, los parámetros tienen que ir en el mismo orden de aparición de los "?".
Cita:
Mi otra consulta es que quisiera partir mi string en 2, es decir tener @consulta1 + @consulta2 pero no me ha funcionado, saben como podria hacerlo?
Son dos consultas distintas y dos sentencias preparadas diferentes.
Si vas a usar una u otra, entonces resuélvelo con IF ... THEN/ELSE/ENDIF
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 06/05/2010, 13:35
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Prepare - Execute en SP

Gracias por la respuesta, pero lo que me gustaria hacer es algo asi:

SET @consulta='select cod_actividad, des_actividad, des_formulario from actividad';
SET @consulta=@consulta+'where actividad.cod_sistema=? and actividad.cod_actividad=?'

Se podria hacer eso?
  #4 (permalink)  
Antiguo 06/05/2010, 13:42
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: Prepare - Execute en SP

Pruébalo.
Yo no lo he necesitado.

Eso si: Acuérdate que en MySQL las cadenas de texto se suman con CONCAT() y no con "+"
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 06/05/2010, 15:53
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Prepare - Execute en SP

intente utilizando:

Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`%` PROCEDURE `sp_1test`(in param_cod_sistema char(2), in param_cod_actividad char(10))
  2.         set @consulta='select cod_actividad, des_actividad, des_formulario from actividad';
  3.         set @consulta=@consulta+ 'where cod_sistema=? and cod_actividad=?';
  4.         set @param_cod_sistema=param_cod_sistema;
  5.         set @param_cod_actividad=param_cod_actividad;
  6.  
  7.         prepare consulta from @consulta;
  8.         execute consulta using @param_cod_sistema, @param_cod_actividad;
  9.         deallocate prepare consulta;

pero no funciono, me pueden ayudar un poco con el concat.
  #6 (permalink)  
Antiguo 06/05/2010, 17:23
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: Prepare - Execute en SP

Te dije que los strings no se encadenan con "+", sino con la función CONCAT().
No estás escribiendo en SQL Server, sino en MySQL...
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `test`.`sp_1test` $$
  4. CREATE PROCEDURE `test`.`sp_1test` (IN param_cod_sistema CHAR(2), IN param_cod_actividad CHAR(10))
  5.         SET @consulta = 'select cod_actividad, des_actividad, des_formulario from actividad';
  6.         SET @consulta = CONCAT(@consulta, ' where cod_sistema=? and cod_actividad=?');
  7.         SET @param_cod_sistema = param_cod_sistema;
  8.         SET @param_cod_actividad = param_cod_actividad;
  9.  
  10.         PREPARE consulta FROM @consulta;
  11.         EXECUTE consulta USING @param_cod_sistema, @param_cod_actividad;
  12.         DEALLOCATE PREPAREconsulta;
  13. END $$
  14.  
  15. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 07/05/2010, 08:42
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Prepare - Execute en SP

Muchas gracias por la ayuda... y tambien por la paciencia
  #8 (permalink)  
Antiguo 07/05/2010, 09:11
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: Prepare - Execute en 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)
  #9 (permalink)  
Antiguo 07/05/2010, 11:32
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Prepare - Execute en SP

Disculpame nuevamente... ese stored procedure funciono bien pero el problema lo tengo con los ?
Estaba trabajando el mismo ejemplo pero con 4 parametros, como podria hacer para llamar especificamente el 3er o 4to parametro?

Este es mi ejemplo:

Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`%` PROCEDURE `inv_sp_tipo_eva_almacen_selectrela2`(
  2. in param_cod_empresa CHAR(5),
  3. in param_cod_tipo_eva CHAR(1),
  4. in param_cod_eva_alm CHAR(3),
  5. in param_des_eva_alm VARCHAR(50))
  6.         set @consulta='select cod_tipo_eva, cod_eva_alm, des_eva_alm from tipo_eva_almacen where cod_empresa=?';
  7.         set @param_cod_empresa=param_cod_empresa;
  8.         set @param_cod_tipo_eva=param_cod_tipo_eva;
  9.         set @param_cod_eva_alm=param_cod_eva_alm;
  10.         set @param_des_eva_alm=param_des_eva_alm;
  11.  
  12.         if(param_cod_tipo_eva!='') then
  13.         set @consulta=concat(@consulta,' and cod_tipo_eva=?');
  14.         end if;
  15.  
  16.         if(param_cod_eva_alm!='') then
  17.         set @consulta=concat(@consulta,' and cod_eva_alm=?');
  18.         end if;
  19.  
  20.         if(param_des_eva_alm!='') then
  21.         set @consulta=concat(@consulta,' and des_eva_alm like concat("%",?,"%")');
  22.         end if;
  23.  
  24.         prepare consulta from @consulta;
  25.         execute consulta using @param_cod_empresa, @param_cod_tipo_eva, @param_cod_eva_alm, @param_des_eva_alm;
  26.         deallocate prepare consulta;

Funciona muy bien cuando se ingresan todos los parametros en el SP, pero si se ingresan por ejemplo 2 de los 4 parametros no tendria como llamar los parametros especificos utilizando ?
No seria lo ideal llenarme de tantos IF.

Espero me puedas indicar una forma de hacer eso, si es que es posible en MySQL.

Gracias!
  #10 (permalink)  
Antiguo 07/05/2010, 12:07
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: Prepare - Execute en SP

Lamentablemente no tienes alternativa, ya que en MySQL no existen los parámetros opcionales, sino que exige que se envíen todos los parámetros que el prototipo tiene.
La única opción es controlar por valor si debe tomar algunso de ellos o todos, y eso solamente lo puedes resolver en la lógica del procedure...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 07/05/2010, 13:27
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Prepare - Execute en SP

Entonces... eso quiere decir que si tengo 4 parametros tendria que hacer 16 IF dentro del SP para poder validar todos los casos?
Poner tantos IF dentro de un SP recargaria la transaccion? ya que puede llegar a tener 200 lineas de codigo... afectaria esto el rendimiento?

Crees que exista otra forma en que pueda verificar estos parametros? si es que estan en blanco o no? La forma en que pensaba hacerlo podria funcionar si es que pudiera llamar un '?' (parametro) especifico.

Muchas gracias por la ayuda gnzsoloyo.
  #12 (permalink)  
Antiguo 07/05/2010, 13:53
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: Prepare - Execute en SP

Cita:
Entonces... eso quiere decir que si tengo 4 parametros tendria que hacer 16 IF dentro del SP para poder validar todos los casos?
Eso solamente tendría sentido si tienes programados en tu aplicación 16 formas diferentes de hacer la consulta...
En realidad creo que te estás asustando por nada.
Si tienes 4 parámetros, y la sentencia es estructuramente la misma, pero con 4 parámetros que pueden o no estar, en realidad solamente tienes 4 IFs que le agregan cada uno un segmento a la consulta...
Lo único complicado es establecer la secuencia de agregaciones al WHERE de la parte necesaria.

¿Se entiende?

Ahora no tengo tiempo suficiente, pero a la noche te puedo dar un ejemplo para tu caso...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 07/05/2010, 14:13
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Prepare - Execute en SP

Muchas gracias por todo gnzsoloyo, apreciaria mucho si me envias el ejemplo
  #14 (permalink)  
Antiguo 07/05/2010, 17:02
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: Prepare - Execute en SP

Este sería un ejemplo, en el cual la idea es jugar con la lógica.
Cuando pones una condición en el WHERE que simplemente es TRUE, es lo mismo que si no existiera; entonces, si suplantamos el parámetro y su comparación asociada simplemente por el TRUE, el parámetro también desaparecerá...
Mira este caso (aclaro que aún no lo he probado, pero compila):
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `TEST`.`inv_sp_tipo_eva_almacen_selectrela2`$$
  3. CREATE PROCEDURE `TEST`.`inv_sp_tipo_eva_almacen_selectrela2`(
  4.   IN param_cod_empresa CHAR(5),
  5.   IN param_cod_tipo_eva CHAR(1),
  6.   IN param_cod_eva_alm CHAR(3),
  7.   IN param_des_eva_alm VARCHAR(50))
  8.   SET @consulta = 'SELECT cod_tipo_eva, cod_eva_alm, des_eva_alm FROM tipo_eva_almacen ';
  9.   SET @condicion =  ' WHERE ';
  10.  
  11.   IF TRIM(param_cod_empresa) != '' THEN
  12.     SET @param_cod_empresa = param_cod_empresa;
  13.     SET @condicion1 = 'cod_empresa=?';
  14.   ELSE
  15.     SET @param_cod_empresa = TRUE;
  16.     SET @condicion1 = '?';
  17.   END IF;
  18.   IF TRIM(param_cod_tipo_eva) != '' THEN
  19.     SET @param_cod_tipo_eva = param_cod_tipo_eva;
  20.     SET @condicion2 = 'cod_tipo_eva=?';
  21.   ELSE
  22.     SET @param_cod_tipo_eva = TRUE;
  23.     SET @condicion2 = '?';
  24.   END IF;
  25.   IF TRIM(param_cod_eva_alm) != '' THEN
  26.     SET @param_cod_eva_alm = param_cod_eva_alm;
  27.     SET @condicion3 = 'cod_eva_alm=?';
  28.   ELSE
  29.     SET @param_cod_eva_alm = TRUE;
  30.     SET @condicion3 = '?';
  31.   END IF;
  32.   IF TRIM(param_des_eva_alm) != '' THEN
  33.     SET @param_des_eva_alm = param_des_eva_alm;
  34.     SET @condicion4 = 'des_eva_alm=?';
  35.   ELSE
  36.     SET @param_des_eva_alm = TRUE;
  37.     SET @condicion4 = '?';
  38.   END IF;
  39.   SET @consulta=CONCAT(@consulta, @condicion, ' AND ' ,@condicion1, ' AND ' ,@condicion2, ' AND ' ,@condicion3, ' AND ' ,@condicion4);
  40.  
  41.   PREPARE consulta FROM @consulta;
  42.   EXECUTE consulta USING @param_cod_empresa, @param_cod_tipo_eva, @param_cod_eva_alm, @param_des_eva_alm;
  43.   DEALLOCATE PREPARE consulta;
  44. END$$
  45. DELIMITER ;

Estas cosas, en realidad se resuelven con imaginación, porque no hay método que lo diga...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 07/05/2010, 17:39
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Prepare - Execute en SP

Gracias gnzsoloyo, estoy seguro que con esto ya soluciono mi problema

Etiquetas: execute, prepare
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 06:37.