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 originaldelimiter $$
SET tantos1
=SUBSTR
(resultado
,1,3); SET tantos2
=SUBSTR
(resultado
,5,7); ELSEIF tantos1
> tantos2
THEN ELSEIF tantos2
> tantos1
THEN ELSEIF tantos1
=tantos2
THEN
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:
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 originaldelimiter $$
ELSEIF tantos2
< tantos1
THEN
delimiter ;
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 originaldelimiter $$
SET tantos1
=SUBSTR
(resultado
,1,3); SET tantos2
=SUBSTR
(resultado
,5,7); ELSEIF tantos1
< tantos2
THEN # No cambies la posicion de las variables, genera errores de comprension a primera vista
# Si tantos1 no es mayor ni menor a tantos2, sólo puede ser igual...
# No tiene sentido evaluarlo dentro de las condiciones de igualdad.
# Es una condicion del parametro de entrada. No mezcles logicas incompatibles
# No tiene sentido usar variables de salida, ni tampoco
# dos salidas, si el SP sólo devolvera un unico resultado.
# alcanza con que luego en la aplciacion evalues la respuesta.
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.