Ver Mensaje Individual
  #2 (permalink)  
Antiguo 30/10/2013, 09:17
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: Duda en Store Procedure

Las instrucciones BEGIN/END se usan en el caso de rutinas almacenadas que tienen más de una sentencia. No son obligatorias para crearlas si son sentencias únicas, y por eso no te da error al omitirlas en este caso.
Ahora bien, por buenas prácticas es conveniente usarlas, pero como son son sentencias de SQL normales, no se pueden dejar abiertas, y cerrar las sentencias con ";" genera un error.
Cuando se usa BEGIN/END, debe realizarse un cambio de delimitador de sentencias momentáneo, cosa que se puede realizar por interfaz, o por consola, según sea el modo en que estés cargando el código en cuestión. Para eso existe el comando DELIMITER.
Si usas el editor de rutinas de MySQL Workbench, no deberías tener problemas, porque esa interfaz pone internamente (transparente para ti), los comandos DELIMITER correspondientes.
Si lo realizas por phpMyadmin, debes indicar el delimitador de sentencias en un textbox para ello.
SI lo haces por consola, o por script, debes hacerlo a mano...
El código quedaría así:
Código MySQL:
Ver original
  1. #Cambia el delimitador momentaneamente
  2. DELIMITER $$
  3. CREATE PROCEDURE MARCACIONES (IN  fecha1 DATE, fecha2 DATE)          
  4.   SELECT
  5.       empre.nombre_razonsocial,
  6.       e.fecha,
  7.       CONCAT(p.Apellidos,' - ',p.Nombres) Nombres,
  8.       p.Documento,
  9.       e.fecha_Entrada,
  10.       e.fecha_Salida_Almuerzo,
  11.       e.fecha_Entrada_Almuerzo,  
  12.       TIMEDIFF(e.fecha_Entrada_Almuerzo,e.fecha_Salida_Almuerzo) Total_Receso,
  13.       e.fecha_Salida Salida_Laboral,
  14.       TIMEDIFF(e.fecha_Salida,e.fecha_Entrada) Total_Labor,
  15.       e.Fecha_Ultimo_Registro  Ultima_Marcacion
  16.     FROM  eventos e
  17.       INNER JOIN personas p ON e.id_ser = p.id_ser
  18.       INNER JOIN  personas_empresa ps ON ps.id_ser = p.id_ser
  19.       INNER JOIN  empresas empre ON empre.id_empresa = ps.id_empresa
  20.     WHERE e.fecha BETWEEN fecha1 AND fecha2
  21.     ORDER BY  p.Nombres,e.fecha ASC
  22.     LIMIT 2000;
  23. END$$
  24.  
  25. #Restaura el delimitador
  26. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)