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

procedimientos almacenados

Estas en el tema de procedimientos almacenados en el foro de Mysql en Foros del Web. buenas quiero saber si se puede realizar esto, @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original IF ( p_rolusuario = 'DISTRIBUIDOR' ) THEN         ...
  #1 (permalink)  
Antiguo 03/10/2013, 16:26
Avatar de shake2427  
Fecha de Ingreso: julio-2011
Mensajes: 116
Antigüedad: 12 años, 9 meses
Puntos: 3
procedimientos almacenados

buenas


quiero saber si se puede realizar esto,

Código SQL:
Ver original
  1. IF (p_rolusuario = 'DISTRIBUIDOR') THEN
  2.             AND b.fecha_recarga BETWEEN p_fechainicial AND p_fechafinal;
  3.         END IF;

o tengo que poner toda la consulta de nuevo.
el procedimiento completo es el siguiente.
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `Consulta_recargas_detallado`(
  2.     IN p_rolusuario varchar(20),
  3.     IN p_IDusuario int(11),
  4.     IN p_fechainicial datetime,
  5.     IN p_fechafinal datetime
  6. )
  7.  
  8.     IF (p_rolusuario = 'DISTRIBUIDOR') THEN
  9.  
  10.     SELECT  a.fecha_venta,
  11.             a.num_iden_cliente as Identificacion,
  12.             a.nombre_Cliente as Cliente,
  13.             a.numero_icc as numero_icc,
  14.             a.celular as numero_celular,        
  15.             b.Valor_recarga as valor_recarga,
  16.             case d.nombre
  17.               when "SIN_NEGOCIO" then d.persona_contacto
  18.               else concat(d.Nombre,d.Apellido)
  19.             end as Negocio,
  20.             b.fecha_recarga,
  21.             b.fecha_Actualizacion
  22.         FROM distribxnegocio c
  23.         INNER JOIN radicaciones a ON a.Id_Radicaciones = c.Id_Radicaciones
  24.         INNER JOIN recargas b ON b.Id_Ditribuidorxnegocio = c.Id_DistribuidorxNegocio
  25.         INNER JOIN negocios d ON d.Id_Negocio = c.Id_negocio
  26.         where a.Celular = b.num_celular
  27.         AND a.producto = "PREPAGO"
  28.         AND a.id_radicaciones = c.id_radicaciones
  29.         AND a.numero_icc = a.Numero_Icc
  30.         AND c.id_distribuidor in (select id_distribuidores from distribuidores where id_usuario = p_IDusuario)
  31.         AND c.estado = 1
  32.         AND a.estado = 1
  33.         AND b.estado = 1;
  34.  
  35.            IF (p_rolusuario = 'DISTRIBUIDOR') THEN
  36.             AND b.fecha_recarga BETWEEN p_fechainicial AND p_fechafinal;
  37.         end if;
  38.  
  39.        
  40.        
  41.     END IF;
  #2 (permalink)  
Antiguo 03/10/2013, 17: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, 5 meses
Puntos: 2658
Respuesta: procedimientos almacenados

Los controladores de flujo (IF... THEN ..., CASE... WHEN...) existen única y exclusivamente en los stored procedures.
De todos modos ese IF no tiene absolutamente ningún sentido, por tres razones: Primero porque al ser p_rolusuario un parámetro absoluto de entrada, se trataría de una validación que debería existir en el programa que invoca el SP. No tiene ninguna utilidad ponerlo en el SP.
Es segundo lugar, lo que estás haciendo es hardcoding, lo que se considera una pésima práctica en BBDD (y en todo tipo de desarrollo en general). Si esa condición sufriera algún tipo de cambio por razones que fuese, te verías obligado a modificar todas las veces en que aparece, en todos los códigos fuentes que tengas.
Eso es una pésima idea. Es mejor parametrizarlo dinámicamente, sea con archivos de configuración o bien en una tabla fija paramétrica.
Finalmente, dentro de tu SP hay un error de lógica absoluto. El segundo nivel de IF, en tu contexto, es redundante:
Código MySQL:
Ver original
  1. IF (p_rolusuario = 'DISTRIBUIDOR') THEN
  2.            IF (p_rolusuario = 'DISTRIBUIDOR') THEN
  3.             ...
  4.         END if;
  5.     END IF;
¿Lo puedes notar?
Es simplemente redundante, porque ya se está cumpliendo con el primero.

Adicionalmente, lo que haces dentro del segundo IF...THEN, no se hace así. No puedes "colgar" una condición que pertenece al WHERE de esa forma, eso no existe.
En todo caso deberías (si fuese necesario, crear una sentencia preparada, cosa que tampoco es necesaria. Lo mejor es que armes un código coherente que contemple todas las condiciones y alternativas para obtener diferentes resultados según las condiciones que correspondan, aunque eso implique escribir N veces la misma sentencia, en diferentes niveles de ELSEIF...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, 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 06:11.