Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/05/2010, 20:03
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: 16 años, 5 meses
Puntos: 2658
Respuesta: Stored function de numero a letras

El problema es que estás tratando de usar un código para SQL Server y trasladarlo a MySQL sin tener en cuenta que los lenguajes procedurales no son compatibles entre diferentes DBMS.
No sólo sucede a nivel de ciertas funciones. Los operadores no se escriben igual en muchos casos, por lo que en realidad hay varios y problemáticos defectos en el script, si pretendes usarlo en MySQL.
Algunos casos:
1) Lo que tienes aquí es un STORED FUNCTION y no un STRORED PROCEDURE. No es lo mismo; una de las diferencias substanciales es que MySQL no admite salidas de resultados fuera del RETURN, por lo que el uso de SELECT como medio de asignación de datos es incorrecto. Otra de sus diferencias es que se debe declara, antes del BEGIN, READS SQL DATA, si vas a acceder a tablas, por ejemplo.

2) El uso de "=" para asignar un valor a una variable o un campo, sólo se produce con SET, y no con SELECT.
Para que se entienda bien:
Código MySQL:
Ver original
  1. SELECT XlcCadena = 'OCHENTA';
no es una asignación, sino una comparación lógica (el valor de XlcCadena con la cadena 'OCHENTA').
Así, esto:
Código MySQL:
Ver original
  1. SELECT XlcCadena =
  2.             CASE /* UNIDADES */
  3.                 WHEN XlnUnidades = 1 AND XlnTerna = 1 THEN 'UNO ' + XlcCadena
  4.                 WHEN XlnUnidades = 1 AND XlnTerna <> 1 THEN 'UN ' + XlcCadena
  5.                 WHEN XlnUnidades = 2 THEN 'DOS ' + XlcCadena
  6.                 WHEN XlnUnidades = 3 THEN 'TRES ' + XlcCadena
  7.                 WHEN XlnUnidades = 4 THEN 'CUATRO ' + XlcCadena
  8.                 WHEN XlnUnidades = 5 THEN 'CINCO ' + XlcCadena
  9.                 WHEN XlnUnidades = 6 THEN 'SEIS ' + XlcCadena
  10.                 WHEN XlnUnidades = 7 THEN 'SIETE ' + XlcCadena
  11.                 WHEN XlnUnidades = 8 THEN 'OCHO ' + XlcCadena
  12.                 WHEN XlnUnidades = 9 THEN 'NUEVE ' + XlcCadena
  13.                 ELSE XlcCadena
  14.             END; /* UNIDADES */
Es en realidad una comparación que intentará devolver un dato (TRUE o FALSE) por fuera del RETURN.

3) Esta sentencia está mal escrita:
Código MySQL:
Ver original
  1. SELECT Xresultado = RTRIM(XlcRetorno) + ' CON ' + LTRIM(STR(XlnFraccion,2)) + '/100 ' + XMoneda ;
En MySQL el operador "+" no está definido para crear cadenas de texto, sino sólo para operar números, por lo que dará error (es el error de la línea 115).
Para crear cadenas sobre la base de segmentos distintos, MySQL tiene una función: CONCAT():
Código MySQL:
Ver original
  1. SET xresultado = CONCAT(RTRIM(XlcRetorno), ' CON ', LTRIM(STR(XlnFraccion,2)), '/100 ', XMoneda );

Por último, ten cuidado con el Navicat. Suele agregar espacios entre el nombre de una función y su primer paréntesis, cosa que MySQL no admite, generando un error de sintaxis difícil de detectar.
Es decir, te transforma esto:
Código MySQL:
Ver original
  1. SET xresultado = CONCAT(RTRIM(XlcRetorno), ' CON ', LTRIM(STR(XlnFraccion,2)), '/100 ', XMoneda );
en esto:
Código MySQL:
Ver original
  1. SET xresultado = CONCAT (RTRIM (XlcRetorno), ' CON ', LTRIM (STR (XlnFraccion,2)), '/100 ', XMoneda );
Lo más difícil de detectar de este problema es que sólo se produce en tiempo de ejecución, y no al generar scripts, por lo que sólo recibes un mensaje de error que nunca puedes determinar porque todo parece estar bien...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)