Ver Mensaje Individual
  #2 (permalink)  
Antiguo 13/12/2013, 06:28
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, 5 meses
Puntos: 2658
Respuesta: Problemas con MySQL

Bueno, hay varios defectos, algunos de lógica, otros de planteamiento, y uno que supongo que no conoces y es de performance.
- Los cursores en MySQL son una muy mala idea, que debe ser usada si y sólo si es estrictamente necesario, ya que tienen una pésima performance, son lentos y `pueden generar problemas de timeout.
- Por otro lado, una asignación de valores de un SELECT a un grupo de variables no se hace como muestras en las líneas 59 y 60 (te recomiendo usar lo highligts para que las cosas se puedan leer bien). Eso no es una asignación, no estás programando en un lenguaje, sino haceiendo una consulta. Eso que haces es una comparación lógica que devuelve TRUE o FALSE según el caso (debe estar devolviendo todo FALSE.
- No necesitas tresce SELECT para hacer lo que quieres. Con uno sólo alcanzaría.
- No tiene sentido hacer semejante cantidad de IFs, podrías encapsular el comportamiento en una stored function, y además en lugar de hacer semejante cantidad de IFs, sería más práctico usar un controlador de flujo como CASE, que es más eficiente para el caso.


Sin meterme en el uso del CURSOR (que ya dije que no me parece práctico), lo del SELECT sería:

Código MySQL:
Ver original
  1. Select Primero, Segundo, Tercero, Cuarto, Quinto, Sexto,
  2.      Septimo, Octavo, Noveno, Decimo, pole1, pole2, pole3, ultimo
  3. FROM tbAustralia
  4. WHERE IDUser = xID
  5. INTO xpos1, xpos2, xpos3, xpos4, xpos5, xpos6, xpos7, xpos8,
  6.       xpos9, xpos10, xpole1, xpole2, xpole3, xpult;

Respecto a los doce SELECT, yo lo plantearía:
Código MySQL:
Ver original
  1.     IF(Australia = 1, Piloto, '') P1,
  2.     IF(Australia = 2, Piloto, '') P2,
  3.     IF(Australia = 3, Piloto, '') P3,
  4.     IF(Australia = 4, Piloto, '') P4,
  5.     IF(Australia = 5, Piloto, '') P5,
  6.     IF(Australia = 6, Piloto, '') P6,
  7.     IF(Australia = 7, Piloto, '') P7,
  8.     IF(Australia = 8, Piloto, '') P8,
  9.     IF(Australia = 9, Piloto, '') P9,
  10.     IF(Australia = 10, Piloto, '') P10
  11. FROM tbPosiciones
  12. WHERE  Temporada = 2013
  13. INTO xPiloto1,
  14.     xPiloto2 ,
  15.     xPiloto3 ,
  16.     xPiloto4 ,
  17.     xPiloto5 ,
  18.     xPiloto6 ,
  19.     xPiloto7 ,
  20.     xPiloto8 ,
  21.     xPiloto9 ,
  22.     xPiloto10;

Lo mismo para el otro:
Código MySQL:
Ver original
  1.     IF(Australia = 1, Piloto, '') Po1,
  2.     IF(Australia = 2, Piloto, '') Po2,
  3.     IF(Australia = 3, Piloto, '') Po3
  4. FROM tbPoles
  5. WHERE  Temporada = 2013
  6. INTO xPilotoPole1,
  7. xPilotoPole2,
  8. xPilotoPole3;

Código MySQL:
Ver original
  1. Select Piloto
  2. FROM tbUltimos
  3. WHERE  Australia = 1 and Temporada = 2013
  4. INTO xPilotoUltimo;

No me meto todaría con la SF posible, pero si te fijas en el manual de referencia, podrás ver cómo se usa.
de todos modos, por lo que puedo alcanzar a ver, a mi entender tu modelo de datos no está normalizado, tiene algunos defectos severos, y a futuro te traerá problemas. Pero eso es otro tema distinto.

A la noche me fijo mejor en el SP. Ahora estoy en el trabajo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)