Ver Mensaje Individual
  #2 (permalink)  
Antiguo 03/10/2013, 17:59
Avatar de gnzsoloyo
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: 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)