MySQL - [Ayuda] Procedimiento Almacenado

   
Vista:

[Ayuda] Procedimiento Almacenado

Publicado por pablo (3 intervenciones) el 02/03/2016 03:08:48
Hola, estoy intentando crear procedimientos en MySQL y se me esta haciendo una tortura, llevo como media hora viendo ejemplos y ninguno me funciona, la tabla es la siguiente:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create table usuario
(
	idUsuario int auto_increment,
	nick varchar(20) not null,
	contra varchar(20) not null,
	nombre varchar(20),
	apellido varchar(20),
	mail varchar(40) not null,
	pais varchar(20),
	fechaRegistro datetime not null,
	tipo int not null,
	ciudad varchar(30),
	puntaje numeric(2,2) not null,
	primary key (idUser)
 
);

El objetivo es crear una procedimiento para poder insertar usuarios, poder manejar transacciones como lo hago comunmente en Oracle, pero MySQL me mato, no me dejo hacer ni un procedimiento común

mi intento fue este:



1
2
3
4
5
create procedure insertarUsuario(in nick varchar(20), in contra varchar(100), in mail varchar(40), in pais varchar(20))
BEGIN
    insert into usuario (nick, contra, mail, pais, fechaRegistro, tipo, puntaje)
    values (nick, contra, mail, pais, sysdate(), 0, 0.0);
end;

Alguien con un poco de experiencia en MySQL me dice donde esta el error? y como haría si quiero hacer de este procedimiento una transacción? vi que simplemente se pone un "start transaction" y un "commit" al final

Otra cosa, conviene crear procedimientos almacenados con transacciones? siempre lo hice por un hecho de seguridad, y ahorro de código, pero soy nuevo en MySQL.

Saludos y gracias de antemano!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

[Ayuda] Procedimiento Almacenado

Publicado por Gonzalo (103 intervenciones) el 02/03/2016 13:28:54
Hay varios temas a corregir:
1) No nos estás diciendo qué estás usando para cargar el SP. Si usas la consola, MySQL Workbench o phpMyadmin, hay cosas que tienes que tener en ceunta, ya que no se manejan igual.
2) Mira el manual para ver bien el uso de las funciones de fecha. No todas tienen el mismo comportamiento y SYSDATE() es algo insegura (https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_sysdate).
3) MUY IMPORTANTE: MySQL puede generar errores de difícil diagnóstico cuando usas los mismos nombres para las variables de entrada en el SP, que para los nombres de columnas que se invocan o las tablas. Dada la forma jerarquica de nombres en MySQL, si usas en el INSERT el mismo nombre para campo que para variable, peude interpretar el nombre de la variable como el del campo, generando un resultado erróneo.
Tampoco se deben usar iguales nombres para las tablas que para las columnas.

Respecto a las transacciones, estas pueden usarse DENTRO del stored procedure, O FUERA de él, en la programación de la aplicación. El cómo lo uses es una decisión de diseño. No el DBMS. Yo las he usado de ambas formas sin problemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[Ayuda] Procedimiento Almacenado

Publicado por pablo (3 intervenciones) el 02/03/2016 13:55:12
Estoy usando phmyadmin con xampp
1
2
XAMPP	Apache	MySQL	PHP 5
1.8.2	2.4.9	5.5.36	5.4.27

esa es la version que estoy usando ahora mismo

Vale, voy a cambiar el nombre de las variables de entrada por algo asi como

1
2
3
4
5
create procedure insertarUsuario(in v_nick varchar(20), in v_contra varchar(100), in v_mail varchar(40), in v_pais varchar(20))
BEGIN
    insert into usuario (nick, contra, mail, pais, fechaRegistro, tipo, puntaje)
    values (v_nick, v_contra, v_mail, v_pais, sysdate(), 0, 0.0);
end;



En cuanto al sysdate() lo use porque estoy acostumbrado de Oracle a usarlo, se me hace simple, cuando me recomiendas usar
para MySQL, now() ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[Ayuda] Procedimiento Almacenado

Publicado por Gonzalo (103 intervenciones) el 02/03/2016 14:06:10
Efectivamente, NOW() es un poco más seguro, como dice el manual. Yo también uso Oracle en el trabajo, por lo que ando saltando entre ambos DBMS todo el tiempo.

En cuanto a la carga del SP, para usar phpMyadmin se necesita hacerlo en la solapa de SQL, donde en la parte inferior del area de edicion debes incluir cual es el terminado de sentencia que usarás para cargarlo.
Esto se debe a que tienes que correr un script multilinea como un solo objeto, y no puedes dejar que el terminado sea el punto y coma (;), porque te disparará un error de sintaxis, ¿Eso lo sabías?

Te conviene poner como terminador final un $$, y luego, donde esta el textbox de delimitador, debajo del area de edición, poner el mismo $$.
El script debería quedar en ese caso:

1
2
3
4
5
create procedure insertarUsuario(in v_nick varchar(20), in v_contra varchar(100), in v_mail varchar(40), in v_pais varchar(20))
BEGIN
    insert into usuario (nick, contra, mail, pais, fechaRegistro, tipo, puntaje)
    values (v_nick, v_contra, v_mail, v_pais, sysdate(), 0, 0.0);
end$$

Con eso debería cargarse sin errores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

[Ayuda] Procedimiento Almacenado

Publicado por pablo (3 intervenciones) el 02/03/2016 15:02:27
Había leído algo del delimitador pero lo hacian mediante código y a mi la sentencia de redefinir me daba error, ahora voy a poner a prueba todo lo que me has enseñado, gracias por tu ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

[Ayuda] Procedimiento Almacenado

Publicado por Gonzalo (103 intervenciones) el 02/03/2016 15:21:00
Ponerlo por código sólo aplica a la consola de MySQL.
MySQL Workbench lo maneja internamente, es decir que incluye ese cambio al momento de ejecución, por lo que no hace falta ponerlo en el editor de codigo.
phpMyadmin, por su lado, requiere que se lo indiques, porque de lo contrario asumirá el terminador por default, que es el punto y coma, con lo que se genera un error de ejecución.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar