Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/05/2013, 07:54
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, 2 meses
Puntos: 2658
Respuesta: como saber cuando colocar ; (punto y como) dentro de un stored procedure

El punto y coma (;) es siempre el terminador de sentencias en MySQL. Debe ir siempre donde la sentencia termine, y el error que te sucedió es porque estaba donde no debía.
Los SP son un caso especial.
Los SP deben poder cargarse como un todo, desde el principio al final, pero como pueden contener más de una sentencia, dejar funcionando el terminador normal, genera una ruptura de la carga en el intérprete. Por eso se debe suspender su reconocimiento hasta que el script completo se ingresa. Nota que le cierre del SP es siempre el "END", por lo que el cierre del conjunto debe venir después...
Para gestionar esta contingencia se creó el "DELIMITER" comando de consola y scripts SQL cuyo único objetivo es el de permitir que el interprete tome las rutinas almacenadas sin generar errores. Nada más. No sirve para ninguna otra cosa, y no es reconocido como comando por las librerías de los lenguajes de programación, por lo que no puedes enviarlo desde PHP, VB.Net, C#.net, Java o Python...
No lo tomará.

Ahora bien, cuando usas DELIMITER, la idea es que indiques un delimitador alternativo en forma momentánea (solo para el cuerpo de la rutina a almacenar), y luego lo restaures. Se sugiere no usar caracteres que tengan significado dentro de la lógica de MySQL, para eviotar conflictos, por lo que no debes usar |, ", ', `, /, &, % o cualquier otro símbolo semejante. Fíjate que los manuales de MySQL usan siempre "$$"... por algo es.


Ahora bien, ¿cómo se puede cargar programáticamente una rutina almacenada si no se puede enviar un "DELIMITER". Fácil: mandas la rutina entera como si fuera una sentencia común y corriente. La librería es la que dispara la terminación de la sentencia, así que lo tomará todo como si fuese una sola cosa, y lo almacenará normalmente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)