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

[SOLUCIONADO] procedimientos almacenados error

Estas en el tema de procedimientos almacenados error en el foro de Mysql en Foros del Web. buenas tardes tengo el siguiente codigo @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original -- -------------------------------------------------------------------------------- -- Routine DDL -- Note: comments before and after the routine ...
  #1 (permalink)  
Antiguo 31/07/2013, 14:35
Avatar de shake2427  
Fecha de Ingreso: julio-2011
Mensajes: 116
Antigüedad: 12 años, 9 meses
Puntos: 3
procedimientos almacenados error

buenas tardes

tengo el siguiente codigo

Código MySQL:
Ver original
  1. -- --------------------------------------------------------------------------------
  2. -- Routine DDL
  3. -- Note: comments before and after the routine body will not be stored by the server
  4. -- --------------------------------------------------------------------------------
  5. DELIMITER $$
  6.  
  7. CREATE PROCEDURE `movistarmoviles_dev`.`recargas_detallado_agente` (
  8. in p_iniciolimit int,
  9. in p_finlimit int,
  10. IN p_fechainicial datetime,
  11. IN p_fechafinal datetime
  12. )
  13.  
  14. SET @qryrecdene = concat('SELECT a.fecha_venta,
  15.                                                 b.cod_vendedor as codigo_vendedor,
  16.                                                 b.nom_vendedor as Nombre_vendedor,
  17.                                                 a.num_iden_cliente as Identificacion,
  18.                                                 a.nombre_Cliente as Cliente,
  19.                                                 a.numero_icc as numero_icc,
  20.                                                 a.celular as numero_celular,        
  21.                                                 b.Valor_recarga as valor_recarga,
  22.                                                 (select nombre
  23.                                                    from distribuidores
  24.                                                   where id_distribuidores = (select id_distribuidor  
  25.                                                                                from distribxnegocio
  26.                                                                               where id_radicaciones = a.id_radicaciones)) as Distribuidor,
  27.                                                  (select nombre
  28.                                                      from negocios
  29.                                                     where id_negocio in (select id_negocio from distribxnegocio where id_radicaciones = a.id_radicaciones) ) as Negocio,
  30.                                                 b.fecha_recarga,
  31.                                                 b.fecha_Actualizacion
  32.                                        
  33.                                           FROM radicaciones a, recargas b, distribxnegocio c
  34.                                          where a.Celular = b.num_celular
  35.                                            AND a.producto ="PREPAGO"
  36.                                            and a.id_radicaciones = c.id_radicaciones
  37.                                            and a.numero_icc = (select numero_icc from simcard where id_simcard = c.id_simcard)
  38. ' );
  39.  
  40. if ((p_fechainicial != 0) and (p_fechafinal != 0)) then
  41.     SET @qryrecdene = concat('AND b.fecha_recarga between ', p_fechainicial ,' AND ', p_fechafinal);
  42.  
  43. SET @qryrecdene = concat('order by Negocio');
  44. SET @qryrecdene = concat('LIMIT ', p_iniciolimit ,',', p_finlimit);
  45.  
  46. PREPARE qryexnede FROM @qryrecdene;
  47. EXECUTE qryexnede;
  48.  

pero al tratar de ejecutarlo me muestra un error de sintaxis, le he buscado una y mil formas de buscar la solucion, pero no he podido.

por favor si me pueden ayudar o darme alguna guia.

gracias de antemano.
  #2 (permalink)  
Antiguo 31/07/2013, 14:59
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, 4 meses
Puntos: 2658
Respuesta: procedimientos almacenados error

Estás pisando lo que contiene la variable.
Lo único que termina quedando es esto:
Código MySQL:
Ver original
  1. SET @qryrecdene = CONCAT('LIMIT ', p_iniciolimit ,',', p_finlimit);
Debes encadenar lo que ya tiene la variable con lo que le agregas.
__________________
¿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 31/07/2013, 16:47
Avatar de shake2427  
Fecha de Ingreso: julio-2011
Mensajes: 116
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: procedimientos almacenados error

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Estás pisando lo que contiene la variable.
Lo único que termina quedando es esto:
Código MySQL:
Ver original
  1. SET @qryrecdene = CONCAT('LIMIT ', p_iniciolimit ,',', p_finlimit);
Debes encadenar lo que ya tiene la variable con lo que le agregas.


ya logre que me uniera toda la consulta el codigo es el siguiente

Código SQL:
Ver original
  1. -- --------------------------------------------------------------------------------
  2. -- Routine DDL
  3. -- Note: comments before and after the routine body will not be stored by the server
  4. -- --------------------------------------------------------------------------------
  5. DELIMITER $$
  6.  
  7. CREATE PROCEDURE `movistarmoviles_dev`.`recargas_detallado_agente` (
  8. IN p_iniciolimit INT,
  9. IN p_finlimit INT,
  10. IN p_fechainicial datetime,
  11. IN p_fechafinal datetime
  12. )
  13. BEGIN
  14.  
  15. SET @qryrecdene = concat('SELECT a.fecha_venta,
  16.                                                 b.cod_vendedor as codigo_vendedor,
  17.                                                 b.nom_vendedor as Nombre_vendedor,
  18.                                                 a.num_iden_cliente as Identificacion,
  19.                                                 a.nombre_Cliente as Cliente,
  20.                                                 a.numero_icc as numero_icc,
  21.                                                 a.celular as numero_celular,        
  22.                                                 b.Valor_recarga as valor_recarga,
  23.                                                 (select nombre
  24.                                                    from distribuidores
  25.                                                   where id_distribuidores = (select id_distribuidor  
  26.                                                                                from distribxnegocio
  27.                                                                               where id_radicaciones = a.id_radicaciones)) as Distribuidor,
  28.                                                  (select nombre
  29.                                                      from negocios
  30.                                                     where id_negocio in (select id_negocio from distribxnegocio where id_radicaciones = a.id_radicaciones) ) as Negocio,
  31.                                                 b.fecha_recarga,
  32.                                                 b.fecha_Actualizacion
  33.                                        
  34.                                           FROM radicaciones a, recargas b, distribxnegocio c
  35.                                          where a.Celular = b.num_celular
  36.                                            AND a.producto ="PREPAGO"
  37.                                            and a.id_radicaciones = c.id_radicaciones
  38.                                            and a.numero_icc = (select numero_icc from simcard where id_simcard = c.id_simcard)
  39. ' );
  40.  
  41. IF ((p_fechainicial != 0) AND (p_fechafinal != 0)) THEN
  42.     SET @qryrecdene. = concat('AND b.fecha_recarga between ', p_fechainicial ,' AND ', p_fechafinal);
  43. END IF;
  44.  
  45. SET @qryrecdene. = concat('order by Negocio');
  46. SET @qryrecdene. = concat('LIMIT ', p_iniciolimit ,',', p_finlimit);
  47.  
  48. PREPARE qryexnede FROM @qryrecdene;
  49. EXECUTE qryexnede;
  50.  
  51. END

quiero saber si la condicion del IF esta bien realizada es que estoy llamando el procedimiento de la siguiente forma

call recargas_detallado_agente(1,1000,'2012-11-01','2012-11-13')

y ahi deveria entrar al if y poner el filtro en la consulta pero no me lo pone.
  #4 (permalink)  
Antiguo 31/07/2013, 17:19
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, 4 meses
Puntos: 2658
Respuesta: procedimientos almacenados error

Estás mezclando C con MySQL. Has puesto cosas que nunca vi, y no estoy segudo de que funcionen.
Además, la consulta a mi entender es innecesariamente ineficiente.

Yo la armaría así:
Código MySQL:
Ver original
  1. -- --------------------------------------------------------------------------------
  2. -- Routine DDL
  3. -- Note: comments before and after the routine body will not be stored by the server
  4. -- --------------------------------------------------------------------------------
  5. DELIMITER $$
  6.  
  7. CREATE PROCEDURE `recargas_detallado_agente` (
  8. IN p_iniciolimit int,
  9. IN p_finlimit int,
  10. IN p_fechainicial datetime,
  11. IN p_fechafinal datetime
  12. )
  13.  
  14. SET @qryrecdene = concat('SELECT
  15.     a . fecha_venta ,
  16.     b . cod_vendedor        codigo_vendedor ,
  17.     b . nom_vendedor        Nombre_vendedor ,
  18.     a . num_iden_cliente    Identificacion ,
  19.     a . nombre_Cliente      Cliente ,
  20.     a . numero_icc          numero_icc ,
  21.     a . celular             numero_celular ,
  22.     b . Valor_recarga       valor_recarga ,
  23.     D.nombre               Distribuidor,
  24.     N.nombre               Negocio,
  25.     b . fecha_recarga ,
  26.     b . fecha_Actualizacion
  27. FROM
  28.     radicaciones a
  29.     INNER JOIN  recargas   b ON a.Celular  =  b.num_celular
  30.     INNER JOIN distribxnegocio c ON a.id_radicaciones  =  c.id_radicaciones  
  31.     INNER JOIN distribuidores D ON  D.id_distribuidores = c.id_distribuidor
  32.     INNER JOIN negocios N ON N.id_negocio = c.id_negocio
  33.     INNER JOIN simcard s ON s.id_simcard  =  c.id_simcard
  34. WHERE
  35.       a.producto  = ''PREPAGO''');
  36.  
  37. IF ((p_fechainicial != 0) AND (p_fechafinal != 0)) then
  38.     SET @qryrecdene = concat(@qryrecdene, ' AND b.fecha_recarga between ''', p_fechainicial ,''' AND ''', p_fechafinal, '''');
  39.  
  40. SET @qryrecdene = concat(@qryrecdene, ' order by Negocio');
  41. SET @qryrecdene. = concat(@qryrecdene, 'LIMIT ', p_iniciolimit ,',', p_finlimit);
  42.  
  43. PREPARE qryexnede FROM @qryrecdene;
  44. EXECUTE qryexnede;
  45.  
__________________
¿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 01/08/2013, 06:52
Avatar de shake2427  
Fecha de Ingreso: julio-2011
Mensajes: 116
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: procedimientos almacenados error

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Estás mezclando C con MySQL. Has puesto cosas que nunca vi, y no estoy segudo de que funcionen.
Además, la consulta a mi entender es innecesariamente ineficiente.

Yo la armaría así:
Código MySQL:
Ver original
  1. -- --------------------------------------------------------------------------------
  2. -- Routine DDL
  3. -- Note: comments before and after the routine body will not be stored by the server
  4. -- --------------------------------------------------------------------------------
  5. DELIMITER $$
  6.  
  7. CREATE PROCEDURE `recargas_detallado_agente` (
  8. IN p_iniciolimit int,
  9. IN p_finlimit int,
  10. IN p_fechainicial datetime,
  11. IN p_fechafinal datetime
  12. )
  13.  
  14. SET @qryrecdene = concat('SELECT
  15.     a . fecha_venta ,
  16.     b . cod_vendedor        codigo_vendedor ,
  17.     b . nom_vendedor        Nombre_vendedor ,
  18.     a . num_iden_cliente    Identificacion ,
  19.     a . nombre_Cliente      Cliente ,
  20.     a . numero_icc          numero_icc ,
  21.     a . celular             numero_celular ,
  22.     b . Valor_recarga       valor_recarga ,
  23.     D.nombre               Distribuidor,
  24.     N.nombre               Negocio,
  25.     b . fecha_recarga ,
  26.     b . fecha_Actualizacion
  27. FROM
  28.     radicaciones a
  29.     INNER JOIN  recargas   b ON a.Celular  =  b.num_celular
  30.     INNER JOIN distribxnegocio c ON a.id_radicaciones  =  c.id_radicaciones  
  31.     INNER JOIN distribuidores D ON  D.id_distribuidores = c.id_distribuidor
  32.     INNER JOIN negocios N ON N.id_negocio = c.id_negocio
  33.     INNER JOIN simcard s ON s.id_simcard  =  c.id_simcard
  34. WHERE
  35.       a.producto  = ''PREPAGO''');
  36.  
  37. IF ((p_fechainicial != 0) AND (p_fechafinal != 0)) then
  38.     SET @qryrecdene = concat(@qryrecdene, ' AND b.fecha_recarga between ''', p_fechainicial ,''' AND ''', p_fechafinal, '''');
  39.  
  40. SET @qryrecdene = concat(@qryrecdene, ' order by Negocio');
  41. SET @qryrecdene. = concat(@qryrecdene, 'LIMIT ', p_iniciolimit ,',', p_finlimit);
  42.  
  43. PREPARE qryexnede FROM @qryrecdene;
  44. EXECUTE qryexnede;
  45.  

a que te refieres con cosas que nunca habias visto?

la verdad apenas estoy empezando en esto de los procedimientos almacenados, y me gustaria que me orientaras un poco en este sentido.

gracias de antemano
  #6 (permalink)  
Antiguo 01/08/2013, 07:13
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, 4 meses
Puntos: 2658
Respuesta: procedimientos almacenados error

".=" no existe en MySQL como operador de concatenación. Por eso te pisa el contenido de la variable.
Ese operador, que yo sepa, es de PHP, no de MySQL.
__________________
¿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 01/08/2013, 07:27
Avatar de shake2427  
Fecha de Ingreso: julio-2011
Mensajes: 116
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: procedimientos almacenados error

Código MySQL:
Ver original
  1. SET @qryrecdene. = concat(@qryrecdene, 'LIMIT ', p_iniciolimit ,',', p_finlimit);
  2.  
[/QUOTE]

entonces por que en esta parte le pones el punto, que significa eso?

y en cuanto al query dices que es ineficiente por todas las subconsultas que hay en la consulta?
  #8 (permalink)  
Antiguo 01/08/2013, 07:33
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, 4 meses
Puntos: 2658
Respuesta: procedimientos almacenados error

El punto no va como concatenador de contenidos, Simplemente lo pones como te propongo, ya que la única forma de concatenar cadenas es con CONCAT(), al menos en MySQL.

En cuando a la ineficiencia, ten en cuenta que una subconsulta en el SELECT se ejecuta una vez por cada registro devuelto por la consulta principal. Imaginate con algunos miles de registros, cuál es el efecto de semejante sobrecarga.
Todo dato que peuda ser obtenido en el FROM es siempre mejor. Especialmente cuando se trata de campos FK, ya que existen índices que los administran, los cuales son usados por MySQL al momento de ejecutarla.
Son funcionales las subconsultas contra tablas que devuelven muy pocos registros (alta selectividad), por los parámetros dados, pero sin conocer tu base únicamente puedo hacer suposiciones teóricas.
De todos modos, por lo que puedo ver de las relaciones indicadas en tu query base, todo parece ser resoluble con INNER JOIN, por lo que no termino de comprender para qué o por qué razón quieres hacerlo con subconsultas en las columnas del SELECT.
__________________
¿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 01/08/2013, 07:54
Avatar de shake2427  
Fecha de Ingreso: julio-2011
Mensajes: 116
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: procedimientos almacenados error

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El punto no va como concatenador de contenidos, Simplemente lo pones como te propongo, ya que la única forma de concatenar cadenas es con CONCAT(), al menos en MySQL.

En cuando a la ineficiencia, ten en cuenta que una subconsulta en el SELECT se ejecuta una vez por cada registro devuelto por la consulta principal. Imaginate con algunos miles de registros, cuál es el efecto de semejante sobrecarga.
Todo dato que peuda ser obtenido en el FROM es siempre mejor. Especialmente cuando se trata de campos FK, ya que existen índices que los administran, los cuales son usados por MySQL al momento de ejecutarla.
Son funcionales las subconsultas contra tablas que devuelven muy pocos registros (alta selectividad), por los parámetros dados, pero sin conocer tu base únicamente puedo hacer suposiciones teóricas.
De todos modos, por lo que puedo ver de las relaciones indicadas en tu query base, todo parece ser resoluble con INNER JOIN, por lo que no termino de comprender para qué o por qué razón quieres hacerlo con subconsultas en las columnas del SELECT.


gracias por tu ayuda.

Etiquetas: procedimientos, select
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 01:46.