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

Problema con Store procedure, help me!!

Estas en el tema de Problema con Store procedure, help me!! en el foro de Mysql en Foros del Web. Buenas, como andan? soy nuevo en el forO, aunque siempre leO de aqui las respuestas que son muy buenas... Bueno esta vez no encontre algo ...
  #1 (permalink)  
Antiguo 25/02/2009, 00:58
 
Fecha de Ingreso: abril-2008
Mensajes: 13
Antigüedad: 16 años
Puntos: 0
Pregunta Problema con Store procedure, help me!!

Buenas, como andan? soy nuevo en el forO, aunque siempre leO de aqui las respuestas que son muy buenas... Bueno esta vez no encontre algo que se asemeje con lo que buscO, y aqui mi problema:

Cada vez que hago un store procedure con begin y end no me va, pero cuando lo hago simple si me corre, ha sido tanta mi desesperación que hasta he tratadO de que funcione este codigo pero no me anda:

create procedure nuevo (nombre_usuario int)
BEGIN
insert datos_usuarios values(nombre_usuario);
END


Da el siguiente error:

#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 3

Pero este si funciona:

create procedure nuevo (nombre_usuario int)
insert datos_usuarios values(nombre_usuario);


Claro que este ultimo no sirve de mucho ya que solo agrega una tabla y si quiero agregar más datos a otras tablas no serviria, es por ellos que necesito usar el begin y end, pero no sé como hacerlO... A no ser que la sentencia que estoy haciendo este mal =S esperO su ayuda.

* Algunos datos, tengo el AppServer la ultima version... no se si deba de configurar algo del php.ini =S Gracias de antemano compañerOs.
  #2 (permalink)  
Antiguo 25/02/2009, 04:18
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, 5 meses
Puntos: 2658
Respuesta: Problema con Store procedure, help me!!

Hay dos problemas: a la sentencia INSERT le falta el INTO:
Código sql:
Ver original
  1. DELIMITER $$
  2. INSERT INTO datos_usuarios VALUES(nombre_usuario);

Y además, el problema es que los scripts de SP o de SF, cuando usan las cláusulas BEGIN/END, deben forzosamente desactivar los delimitadores de sentencias, que en este caso es el punto y coma. Esto se debe a que un SP debe ser ingresado como un sólo bloque desde la primera línea hasta la última, y si MySQL encuentra un terminador de sentencia antes del final, intenta compilarlo, dando un error.
Entonces, la solución es ponerle al script una sentencia especial que sólo se usa para esto: DELIMITER. Esta cambia el delimitador de sentencia por otro caracter o conjunto de caracteres. Es conveniente usar conjuntos y no caracteres simples, para que no se generen errores accidentales. En ese caso, lo que se suele usar es un doble signo "$":
Código sql:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE nuevo (nombre_usuario INT)
  3. BEGIN
  4. INSERT INTO datos_usuarios VALUES(nombre_usuario);
  5. END$$
  6. DELIMITER ;

Cuando termina el script debe volverse a poner el delimitador por default o de lo contrario permanecerá el mismo $$.

Un tip final:
Esto solamente funciona al ejecutar scripts o al trabajar con MySQL en modo consola. Si lo haces desde programación de una aplicación, el DELIMITER no se usa.
__________________
¿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 25/02/2009, 08:51
 
Fecha de Ingreso: abril-2008
Mensajes: 13
Antigüedad: 16 años
Puntos: 0
De acuerdo Respuesta: Problema con Store procedure, help me!!

hOla gnzsoloyo, gracias por contestarme, perO dos cositas ^^

la primera, en la sentencia insert no hay problema, yo no utilizo el into y me da igual, claro que en el values debo de ponerle todos los parametros de la tabla.

EMh.. y con lo del Store procedure... como hacerlo cuando no es por consola, es decir por el phpMyAdmin?

Gracias por tu ayuda, te noto que sabes muchO y tal ves resuelvas mi duda ^^
  #4 (permalink)  
Antiguo 25/02/2009, 10:16
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, 5 meses
Puntos: 2658
Respuesta: Problema con Store procedure, help me!!

veamos:

- Si bien es cierto que el INTO es opcional, es buena costumbre tratar de mantener la sintaxis lo mejor escrita posible, a fin de no tener problemas cuando operas contra DBMS demasiado viejos y más estrictos. Cuestión de "pureza" de código.
- Por otro lado, cuando se menciona a una "consola", siempre nos estamos refiriendo a una ventana de D.O.S. que opera en modo texto, y no gráfico. Es la misma que en Widows aparece como "Símbolo de sistema", y que en MySQL se accede a través de la invocación de esa ventana, o por medio del MySQL Query Browser en el menú Tools/MySQL Command Line Client. Oracle también tiene una interfase de línea de comandos, que es el SQL Plus.
__________________
¿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 25/02/2009, 13:14
 
Fecha de Ingreso: abril-2008
Mensajes: 13
Antigüedad: 16 años
Puntos: 0
Respuesta: Problema con Store procedure, help me!!

hOla gnzsoloyo, muy amable en contestarme, si pues esO del INTO es opcional... Y pues lo de consola ya lo habia hecho antes, si no que mi pregunta es como hacerlo desde phpMyAdmin, esto viene cuando instalas el AppServer... Obviamente ahi no puede llevar DELIMITER $$, por que hasta donde sé, es sólo para consola.. La pregunta es como hacerlo desde el phpMyAdmin, como ya lo mencioné anteriormente... Espero tu respuesta compañero, gracias ^^

gracias nuevamente!
  #6 (permalink)  
Antiguo 26/02/2009, 07: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, 5 meses
Puntos: 2658
Respuesta: Problema con Store procedure, help me!!

En esencia, la cosa debería ser simple:
Vete al área de SQL y escribe en el TextArea el código completo del SP. Luego fijate que en esa misma página hay un TextBox que dice "Delimitador", allí pones el $$ y luego lo ejecutas.
Pruebalo yt me cuentas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 26/02/2009, 09:40
 
Fecha de Ingreso: abril-2008
Mensajes: 13
Antigüedad: 16 años
Puntos: 0
Respuesta: Problema con Store procedure, help me!!

Tan fácil como esO! nunca me fije que decia DELIMITADOR! Tal vez si fuera un poco mas observador lo hubiera podido hacer... Gracias compañerO me ha servidO de muxO, te lo agradescO ^^
  #8 (permalink)  
Antiguo 04/01/2012, 12:03
Avatar de hdionicio  
Fecha de Ingreso: enero-2012
Ubicación: Huánuco, Perú
Mensajes: 10
Antigüedad: 12 años, 3 meses
Puntos: 0
Pregunta Respuesta: Problema con Store procedure, help me!!

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En esencia, la cosa debería ser simple:
Vete al área de SQL y escribe en el TextArea el código completo del SP. Luego fijate que en esa misma página hay un TextBox que dice "Delimitador", allí pones el $$ y luego lo ejecutas.
Pruebalo yt me cuentas.
Hola gnzsoloyo.

Tengo un problema similar tal vez usted me ayude, tenemos un software la aplicación para el interfaz del usuario esta en VB.NET y la BD en MySQL y queremos generar un isntalador silencioso donde el cliente ejecute el archivo Install.exe y se instale todo incluyendo el MySQL y la Base Datos donde el cliente ya no esté configurando el MySQL Server ni nada por el estilo.

Estuvimos haciendo pruebas con el InstallShield y InstallAware se genera el instalador todo excelente pero la BD contiene Store Procedure al momento de importar la DB importa las tablas, vistas, etc pero al llegar en los procedures no lo importa pasa de largo. Tal vez tiene una manera de codificar las procedures para que pase en la importacion.

Anexo uno de los procedures.

-- ----------------------------
-- Procedure structure for `ant1`
-- ----------------------------
DROP PROCEDURE IF EXISTS `ant1`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `ant1`(IN `equipo1` varchar(20) , IN `familia1` varchar(50), IN `descripcion1` varchar(100), IN `um1` varchar(5), IN `horas1` double,IN `grupo1` varchar(5))
BEGIN
#Routine body goes here...
declare existe bool;

select count(1)>0 into existe from horas_grupo where equipo = equipo1;
if existe then

CASE grupo1
WHEN "CLI" THEN UPDATE horas_grupo set horas_grupo.hclim = horas_grupo.hclim + horas1 , horas_grupo.hpar = horas_grupo.hpar + horas1, horas_grupo.hexp = horas_grupo.hexp + horas1 where equipo = equipo1;
WHEN "PLA" THEN UPDATE horas_grupo set horas_grupo.hpla = horas_grupo.hpla + horas1, horas_grupo.hpar = horas_grupo.hpar + horas1, horas_grupo.hexp = horas_grupo.hexp + horas1 where equipo = equipo1;
WHEN "MAN" THEN UPDATE horas_grupo set horas_grupo.hman = horas_grupo.hman + horas1, horas_grupo.hpar = horas_grupo.hpar + horas1,horas_grupo.hexp= horas_grupo.hexp + horas1 where equipo = equipo1;
WHEN "INT" THEN UPDATE horas_grupo set horas_grupo.hint = horas_grupo.hint + horas1, horas_grupo.hpar = horas_grupo.hpar + horas1, horas_grupo.hexp = horas_grupo.hexp + horas1 where equipo = equipo1;
ELSE
set horas1 =horas1+0;
END CASE;

else

CASE grupo1
WHEN "CLI" THEN INSERT INTO horas_grupo (equipo,familia,descripcion,um,hclim,hpar,hexp,hpl a,hman,hint) VALUES (equipo1, familia1, descripcion1, um1,horas1,horas1,horas1,0,0,0);
WHEN "PLA" THEN INSERT INTO horas_grupo (equipo,familia,descripcion,um,hpla,hpar,hexp,hcli m,hman,hint) VALUES (equipo1, familia1, descripcion1, um1,horas1,horas1,horas1,0,0,0);
WHEN "MAN" THEN INSERT INTO horas_grupo (equipo,familia,descripcion,um,hman,hpar,hexp,hcli m,hpla,hint) VALUES (equipo1, familia1, descripcion1, um1,horas1,horas1,horas1,0,0,0);
WHEN "INT" THEN INSERT INTO horas_grupo (equipo,familia,descripcion,um,hint,hpar,hexp,hpla ,hman,hclim) VALUES (equipo1, familia1, descripcion1, um1,horas1,horas1,horas1,0,0,0);
ELSE
set horas1 =horas1+0;

END CASE;

end if;
END
;;
DELIMITER ;
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 05:55.