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

[SOLUCIONADO] Error 1064 al crear SP

Estas en el tema de Error 1064 al crear SP en el foro de Mysql en Foros del Web. Buenas! Tengo un problema al querer crear un Store Procedure. La tabla que consulta esta creada como InnoDB. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original DELIMITER ...
  #1 (permalink)  
Antiguo 05/04/2015, 15:23
Avatar de mau_87lp  
Fecha de Ingreso: diciembre-2009
Ubicación: La Plata,Buenos Aires.
Mensajes: 72
Antigüedad: 14 años, 4 meses
Puntos: 3
Pregunta Error 1064 al crear SP

Buenas! Tengo un problema al querer crear un Store Procedure. La tabla que consulta esta creada como InnoDB.
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. USE nombre_base_de_datos$$
  4.  
  5. -- DROP PROCEDURE IF EXISTS SP_ExisteUsuario$$
  6.  
  7. CREATE PROCEDURE SP_ExisteUsuario(
  8. IN p_nick_name VARCHAR(25),
  9. IN p_passwd VARCHAR(25),
  10. IN p_email VARCHAR(100),
  11. OUT p_existe INT
  12. )
  13.     -- Valido la existencia del usuario
  14.     IF EXISTS(SELECT usuario_key FROM usuarios WHERE nick_name = p_nick_name) THEN
  15.         IF EXISTS(SELECT usuario_key FROM usuarios WHERE passwd = SHA1(p_passwd)) THEN
  16.             SET p_existe = 1;
  17.         ELSE
  18.             SET p_existe = 0;
  19.         END IF;
  20.     ELSE IF (SELECT usuario_key FROM usuarios WHERE email = p_email) THEN
  21.         IF EXISTS(SELECT usuario_key FROM usuarios WHERE passwd = SHA1(p_passwd)) THEN
  22.             SET p_existe = 1;
  23.         ELSE
  24.             SET p_existe = 0;
  25.         END IF;
  26.     ELSE
  27.         SET p_existe = 0;
  28.     END IF;
  29. END$$
  30.  
  31. DELIMITER ;
El error que me da es:

"1 queries executed, 0 success, 1 errors, 0 warnings

Query: CREATE PROCEDURE SP_ExisteUsuario( IN p_nick_name VARCHAR(25), IN p_passwd VARCHAR(25), IN p_email VARCHAR(100), OUT p_existe in...

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 26

Execution Time : 0 sec
Transfer Time : 0 sec
Total Time : 0.048 sec
"

No entiendo bien cual es el error y al googlear no encuentro mucho. Busque en el foro y hay un post parecido:
http://www.forosdelweb.com/f86/como-...1064-a-906374/
pero con esto no logre solucionar el problema que tengo.

Desde ya muchas gracias.

Saludos

Última edición por gnzsoloyo; 06/04/2015 a las 03:57
  #2 (permalink)  
Antiguo 05/04/2015, 15:37
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: Error 1064 al crear SP

Primera pregunta: ¿Con que estas ejecutando este script?
¿phpMyadmin, consola de MySQL, MySQL Workbench, otra cosa?
__________________
¿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 05/04/2015, 19:15
(Desactivado)
 
Fecha de Ingreso: abril-2015
Ubicación: España
Mensajes: 616
Antigüedad: 9 años
Puntos: 74
Respuesta: Error 1064 al crear SP

¿y si pones ELSEIF en vez de ELSE IF?
  #4 (permalink)  
Antiguo 05/04/2015, 19:42
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: Error 1064 al crear SP

Cita:
Iniciado por superweb360 Ver Mensaje
¿y si pones ELSEIF en vez de ELSE IF?
El error se le esta disparando mucho antes de llegar al IF, lo que planteas es irrelevante en este punto.
Yo pregunto por la interfaz porque ese tipo de mensaje de error suelen darse en phpMyadmin, cuando se lo usa mal por inexperiencia. Por eso es primero importante saber en qué contexto de compilación se esta dando.
__________________
¿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 05/04/2015, 22:37
Avatar de mau_87lp  
Fecha de Ingreso: diciembre-2009
Ubicación: La Plata,Buenos Aires.
Mensajes: 72
Antigüedad: 14 años, 4 meses
Puntos: 3
Respuesta: Error 1064 al crear SP

Gracias por las respuestas. Eso lo ejecute desde SQLyog, igualmente esto lo ejecute desde phpMyAdmin y me daba un error mas o menos parecido:

"MySQL ha dicho:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 26
"

Aclaro que vengo de trabajar con Sql Server y hay cosas que en MySql no me cierran del todo o no entiendo por desconocimiento. Pero modifique el "ELSE IF" por "ELSEIF" y parece que funciono.

Algo que veo raro que no me funciona, es que ejecuto el codigo que puse en el post por primera ves(cuando el SP no existe) y me lo crea. Pero si ejecuto el script varias veces simulando, por ejemplo lo que puede pasar en una empresa cuando un implementador por error ejecuta varias veces un script en produccion, y en mi caso creo que no me funciona.
Lo que yo espera cuando pongo "DROP PROCEDURE IF EXISTS SP_ExisteUsuario $$" es que al inicio de la ejecucion si el SP existe, me lo elimine, y luego lo cree. A diferencia de esto en la primer ejecucion del script, me crea el SP. En la segunda ejecucion solo me borra el SP, pero no me lo vuelve a crear y recien en la tercera me lo crea. Porque es esto? Estoy haciendo algo mal? Me falta algo en el script?

Desde ya muchas gracias.
Saludos
  #6 (permalink)  
Antiguo 06/04/2015, 03:21
(Desactivado)
 
Fecha de Ingreso: abril-2015
Ubicación: España
Mensajes: 616
Antigüedad: 9 años
Puntos: 74
Respuesta: Error 1064 al crear SP

prueba de quitar el DROP PROCEDURE y pon esto:

CREATE OR REPLACE PROCEDURE SP_ExisteUsuario(
  #7 (permalink)  
Antiguo 06/04/2015, 03:39
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: Error 1064 al crear SP

Eso no funciona en MySQL con los SP...

Por favor, leer el manual de referencia.

Posdata: Bueno, finalmente pudie verificar en mi PC con el uso de MySQL Workbench donde estaba el error, y efectivamente, el problema era el IF principal, porque en el contexto en que lo escribiste estabas poniendo dos condiciones ELSE, tal como lo mencionó superweb360 (aunque debió aclarar exactamente a qué se refería).
Para la logica de cualquier DBMS, no es lo mismo poner:

Código MySQL:
Ver original
  1. IF .... THEN
  2. ELSEIF

que poner

Código MySQL:
Ver original
  1. IF .... THEN
  2.     END IF
Cuando separas ELSEIF en ELSE /IF, estás creando un IF anidado y no dando una condición nueva al mismo IF inicial.

Tenlo en cuenta.

En cuanto al SP de origen, no cambies los delimitadores sino sólo cuando es necesario, y eso es sólo cuando vas a compilar el codigo. No antes.
Código MySQL:
Ver original
  1. USE nombre_base_de_datos;
  2.  
  3. DROP PROCEDURE IF EXISTS SP_ExisteUsuario;
  4.  
  5. DELIMITER $$
  6. CREATE PROCEDURE SP_ExisteUsuario(
  7. IN p_nick_name VARCHAR(25),
  8. IN p_passwd VARCHAR(25),
  9. IN p_email VARCHAR(100),
  10. OUT p_existe INT
  11. )
  12.     -- Valido la existencia del usuario
  13.     IF EXISTS(SELECT usuario_key FROM usuarios WHERE nick_name = p_nick_name) THEN
  14.         IF EXISTS(SELECT usuario_key FROM usuarios WHERE passwd = SHA1(p_passwd)) THEN
  15.             SET p_existe = 1;
  16.         ELSE
  17.             SET p_existe = 0;
  18.         END IF;
  19.     ELSEIF (SELECT usuario_key FROM usuarios WHERE email = p_email) THEN
  20.         IF EXISTS(SELECT usuario_key FROM usuarios WHERE passwd = SHA1(p_passwd)) THEN
  21.             SET p_existe = 1;
  22.         ELSE
  23.             SET p_existe = 0;
  24.         END IF;
  25.     ELSE
  26.         SET p_existe = 0;
  27.     END IF;
  28.  
  29. END $$
  30.  
  31. DELIMITER ;
Ahora bien, cuando usas phpMyadmin para crear SP, no debes usar un script completo como ese, sino solo el bloque de creación del SP, y poner el delimitador en el text box que se encuentra mas abajo del bloque de edicion de SQL.
phpMyadmin se encargará del resto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 06/04/2015 a las 04:08
  #8 (permalink)  
Antiguo 08/04/2015, 21:37
Avatar de mau_87lp  
Fecha de Ingreso: diciembre-2009
Ubicación: La Plata,Buenos Aires.
Mensajes: 72
Antigüedad: 14 años, 4 meses
Puntos: 3
De acuerdo Respuesta: Error 1064 al crear SP

Buenas!
Gracias por toda la ayuda y si estoy leyendo la documentacion de MySql pero todavia estoy muy acostumbrado a sql server y hay cosas que se me pasan.
Lo que me comentas del IF lo pase por alto, para la proxima voy a tratar de estar mas atento.
Modifique la posicion donde estaba poniendo el delimitador y funciono perfecto.

Gracias de nuevo.
Saludos

Etiquetas: 1064, innodb, procedure, store, stored, stored-procedure
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 22:40.