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

Procedimiento con un resultado pasado como parámatreo

Estas en el tema de Procedimiento con un resultado pasado como parámatreo en el foro de Mysql en Foros del Web. Hola, A ver si podeis ayudarme con este ejercicio. En la base de datos ‘liga’, crea un procedimiento que rellene los campos ‘pg’ y ‘pp’ ...
  #1 (permalink)  
Antiguo 21/05/2015, 03:46
 
Fecha de Ingreso: febrero-2013
Ubicación: denia
Mensajes: 13
Antigüedad: 11 años, 2 meses
Puntos: 0
Procedimiento con un resultado pasado como parámatreo

Hola,
A ver si podeis ayudarme con este ejercicio.
En la base de datos ‘liga’, crea un procedimiento que rellene los campos ‘pg’ y ‘pp’ de la tabla ‘equipo’ en base a los resultados. Para ello crea antes un procedimiento que
devuelva un ‘1’,’X’ o ‘2’, con un resultado que se pase
como parámetro, según sea victoria, empate o derrota.
He realizado la segunda parte del ejercicio,y no se si es que me he dejado alguna sentencia porque al hacer la llamada al procedimiento el valor de la variable result es null,cuando debería se 1,x o 2 según las condiciones.
Código MySQL:
Ver original
  1. delimiter $$
  2. drop procedure if exists resultados$$
  3. create procedure resultados(resultado char(7))
  4.  
  5. declare tantos1 integer;
  6. declare tantos2 integer;
  7. declare result char(1);
  8.  
  9. if length(resultado)=7
  10. set tantos1=substr(resultado,1,3);
  11. set tantos2=substr(resultado,5,7);
  12. elseif
  13. tantos1 >  tantos2  
  14. set result='1';
  15. elseif
  16. tantos2 > tantos1
  17. set result='2';
  18. elseif
  19. tantos1=tantos2
  20. set result='x';
  21. select ('error');
  22. select result as 'resultado';
  23. end;$$
  24.  
  25. call resultados('088-087');$$
en cuánto a que se actualicen los partidos ganados y perdidos según el resultado sea 1,x, o 2 sería código dentro del mismo procedimiento?

Un saludo.
  #2 (permalink)  
Antiguo 21/05/2015, 06:57
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: Procedimiento con un resultado pasado como parámatreo

En MySQL, todo parámetro declarado en el prototipo, donde no se indique si es IN, OUT o INOUT, por defecto es IN, lo que significa que no tu SP no puede devolver resutlados por parámetro...
Delcaralo INOUT.

Código MySQL:
Ver original
  1. CREATE PROCEDURE resultados(INOUT resultado char(7))
  2. ...

De esa forma podrás recuperar el parámetro.

Ahora bien, si el tema es que estás invocando este SP programáticamente, dependerá del lenguiaje el cómo se hace (OFF TOPIC en este foro), pero en cualquiera de los casos debes enviar a ejecutar el SP como sio fuera un SELECT común, porque lo que devolverá será una tabla, y no un valor único en un parámetro.
__________________
¿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 22/05/2015, 02:20
 
Fecha de Ingreso: febrero-2013
Ubicación: denia
Mensajes: 13
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Procedimiento con un resultado pasado como parámatreo

Hola,
Sigue sin devolver 1,x o 2 con INOUT al pasarle un resultado.
Y otra cosa,¿es correcto el código que señalo para que se rellenen los campos pg,pp según el resultado obtenido?.
Gracias.
  #4 (permalink)  
Antiguo 22/05/2015, 05:36
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: Procedimiento con un resultado pasado como parámatreo

Bueno, tomé tu SP, lo copie y le di un formato un poco más claro, porque tal como estaba escrito, sin indentaciones, era imposible de entender a simple vista.
Te recomiendo codificar los SP de un modo estructurado, tal que te permita ver claramente lo que sucede.

La cosa es así:
Código MySQL:
Ver original
  1. delimiter $$
  2. DROP PROCEDURE IF EXISTS resultados$$
  3. CREATE PROCEDURE resultados(INOUT resultado CHAR(7))
  4.  
  5.     DECLARE tantos1 INTEGER;
  6.     DECLARE tantos2 INTEGER;
  7.     DECLARE result CHAR(1);
  8.  
  9.     IF LENGTH(resultado)=7 THEN
  10.         SET tantos1=SUBSTR(resultado,1,3);
  11.         SET tantos2=SUBSTR(resultado,5,7);
  12.     ELSEIF tantos1 > tantos2 THEN
  13.         SET result='1';
  14.     ELSEIF tantos2 > tantos1 THEN
  15.         SET result='2';
  16.     ELSEIF tantos1=tantos2 THEN
  17.             SET result='x';
  18.     ELSE
  19.         SELECT ('error') resultado;
  20.     END IF;
  21.     SELECT result resultado;
  22. END$$
  23.  
  24. DELIMITER ;
Con eso a la vista, el problema es harto evidente: Nunca entrará en ningún ELSEIF ni ELSE, porque al momento de iniciar el IF, el valor de ambas variables es CERO.
Le estás asignando el valor dentro del IF inicial, y todos los ELSEIF operan después.
Un ELSEIF devuelve TRUE y ejecuta su código si y sólo si el IF inicial devuelve FALSE, que no sería el caso. Solo sucedería si el CALL fuese algo como por ejemplo:

Código MySQL:
Ver original
  1. CALL resultados('088087');
Es decir, debería tener menos o más de 7 caracteres para ser FALSE y recién alli entraría en los ELSEIF.
Ahora bien, si pasara eso, el valor de tantos1 y tantos2 sería NULL, porque están declaradas pero no incializadas. Y en todo caso podrían tener valor cero, de poseer una condición de default.
Pero como no estás evaluando el NULL, y NULL no funciona con operadores lógicos comunes en MySQL, la consecuencia sería que saliese por ELSE, devolviendo la cadena "error". Si el valor por default de las variabls fuese cero, entonces podría salir con valor "X".
Pero son las unicas alternativas.

Yo veo dos cosas principales:
1) No entiendo por qué quieres usar una única variable de entrada, cuando siendo una comparación lo óptimo sería hacerlo con dos numéricas.
Código MySQL:
Ver original
  1. delimiter $$
  2. DROP PROCEDURE IF EXISTS resultados$$
  3. CREATE PROCEDURE resultados(IN valor1 INT, IN valor2 INT, OUT resultado CHAR(10))
  4.     IF valor1 > valor2  THEN
  5.         SET resultado = '1';
  6.     ELSEIF tantos2 < tantos1 THEN
  7.         SET resultado = '2';
  8.     ELSE
  9.             SET resultado = 'x';
  10.     END IF;
  11.     SELECT resultado;
  12. END$$
  13.  
  14. delimiter ;
  15.  
  16. CALL resultados(88, 087, result);

2) Estás complicando innecesariamente el script y anidando incorrectamente las validaciones, además de validar en un mismo IF cosas que no están relacionadas.
Esto sería lo tuyo, limpio:
Código MySQL:
Ver original
  1. delimiter $$
  2. DROP PROCEDURE IF EXISTS resultados$$
  3. CREATE PROCEDURE resultados(IN resultado CHAR(7))
  4.  
  5.     DECLARE tantos1 INTEGER;
  6.     DECLARE tantos2 INTEGER;
  7.     DECLARE result CHAR(7);
  8.     IF LENGTH(TRIM(resultado)) =7 THEN
  9.         SET tantos1=SUBSTR(resultado,1,3);
  10.         SET tantos2=SUBSTR(resultado,5,7);
  11.         IF tantos1 > tantos2 THEN
  12.             SET result='1';
  13.         ELSEIF tantos1 < tantos2 THEN
  14.             # No cambies la posicion de las variables, genera errores de comprension a primera vista
  15.             SET result='2';
  16.         ELSE
  17.             # Si tantos1 no es mayor ni menor a tantos2, sólo puede ser igual...
  18.             SET result='x';
  19.         END IF;
  20.     ELSE
  21.         # No tiene sentido evaluarlo dentro de las condiciones de igualdad.
  22.         # Es una condicion del parametro de entrada. No mezcles logicas incompatibles
  23.         SELECT ('error') resultado;
  24.     END IF;
  25.     # No tiene sentido usar variables de salida, ni tampoco
  26.     # dos salidas, si el SP sólo devolvera un unico resultado.
  27.     # alcanza con que luego en la aplciacion evalues la respuesta.
  28.     SELECT result resultado;
  29. END$$
  30.  
  31. DELIMITER ;

Una nota final: Los SP no se hacen para hacer procesos de este tipo, sino para procesos donde realizará consultas a la base de datos. En todo caso, si devolverá sólo una cadena de texto siempre, debería ser una stored function, y no un stored procedure.

Este ejercicio no tiene sentido en MySQL, es propio de programación en algún lenguaje y carece de utilidad en una base de datos. Si te lo dieron como ejercitación, está muy mal pensado.

Nota 2: Cambie los parametros a IN, porque si estás enviando una constante, entonces el resultado se pierde. Para que te funcione deberás invocar el SP en MYSQL, o bien deberás hacerlo por lenguaje de programación de la misma forma en que realizas una consulta a una tabla, ya que ese SP devolverá una tabla.
__________________
¿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 23/05/2015, 03:01
 
Fecha de Ingreso: febrero-2013
Ubicación: denia
Mensajes: 13
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Procedimiento con un resultado pasado como parámatreo

Muy buena explicación ,creo que ya lo he entendido.Perdón por la mala indexación,y si,es un ejercicio del profesor de mysql de la plataforma a distancia.Solo puse un parámetro en el SP porque quería pasarle el resultado en formato 'xxx-xxx'.
Saludos!

Etiquetas: campo, procedimiento, resultado, select, tabla
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 17:00.