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

[SOLUCIONADO] Usando argumento en función MySQL

Estas en el tema de Usando argumento en función MySQL en el foro de Mysql en Foros del Web. Hola a todos :). Miren, me preguntaba si podrían ayudarme con un pequeño problema que tengo con las funciones en MySQL: resulta que da error ...
  #1 (permalink)  
Antiguo 13/09/2012, 07:39
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Pregunta Usando argumento en función MySQL

Hola a todos :).
Miren, me preguntaba si podrían ayudarme con un pequeño problema que tengo con las funciones en MySQL: resulta que da error cuando hago:
Código:
set existe = ( select count(nombre) from intentos where nombre=username );
porque username es un argumento (argv[0] para ser más exactos) que le pasamos a la función, pero que MySQL da error al usar dentro de una consulta dentro de dicha función.



Esta es la tabla:
Código:
create table usuario
(
  nombre varchar(20) not null,
  edad tinyint not null
) engine=myisam; -- Es MyISAM porque voy a hacer muchos selects sobre esta tabla


Y aquí la función:

Código:
delimiter |
create function miweb.edad_numero(username varchar(20)) returns tinyint
begin
  declare existe tinyint;
  declare edad_num tinyint;

  set existe = ( select count(nombre) from intentos where nombre=username ); -- Si el usuario existe en la tabla o no

  if existe <> 0 -- Si existe de verdad (si count() no devuelve cero)
    set intentos_num = ( select edad from intentos where nombre=username );
  else -- La edad por defecto son 18
    set edad_num = 18;
    insert into usuario(nombre, edad) values(username, 18);
  end if;
  
  return edad_num;
end |



Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 13/09/2012, 07:49
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Usando argumento en función MySQL

Hola kies89:

Dale un vistazo a esta liga, ahí aparece cuál es la sintaxis para asignar valores a variables con un select

http://dev.mysql.com/doc/refman/5.0/...statement.html

Saludos
Leo
  #3 (permalink)  
Antiguo 13/09/2012, 07:52
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Usando argumento en función MySQL

Hola, muchas gracias por responder, ahora lo miro.
Y perdón, he colocado mal la entrada: esta es la correcta:







Hola a todos :).
Miren, me preguntaba si podrían ayudarme con un pequeño problema que tengo con las funciones en MySQL: resulta que da error cuando hago:
Código:
set existe = ( select count(nombre) from usuario where nombre=username );
porque username es un argumento (argv[0] para ser más exactos) que le pasamos a la función, pero que MySQL da error al usar dentro de una consulta dentro de dicha función.



Esta es la tabla:
Código:
create table usuario
(
  nombre varchar(20) not null,
  edad tinyint not null
) engine=myisam; -- Es MyISAM porque voy a hacer muchos selects sobre esta tabla


Y aquí la función:

Código:
delimiter |
create function miweb.edad_numero(username varchar(20)) returns tinyint
begin
  declare existe tinyint;
  declare edad_num tinyint;

  set existe = ( select count(nombre) from usuario where nombre=username ); -- Si el usuario existe en la tabla o no

  if existe <> 0 -- Si existe de verdad (si count() no devuelve cero)
    set edad_num = ( select edad from usuario where nombre=username );
  else -- La edad por defecto son 18
    set edad_num = 18;
    insert into usuario(nombre, edad) values(username, 18);
  end if;
  
  return edad_num;
end |



Muchas gracias de antemano.
  #4 (permalink)  
Antiguo 13/09/2012, 08:08
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Usando argumento en función MySQL

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola kies89:

Dale un vistazo a esta liga, ahí aparece cuál es la sintaxis para asignar valores a variables con un select

[url]http://dev.mysql.com/doc/refman/5.0/es/select-into-statement.html[/url]

Saludos
Leo

Vale, el insert creo que lo he puesto bien, ¿y para el select qué podría hacer? :).




Código:
delimiter |
create function miweb.edad_numero(username varchar(20)) returns tinyint
begin
  declare existe tinyint;
  declare edad_num tinyint;

  set existe = ( select count(nombre) from usuario where nombre=username ); -- Si el usuario existe en la tabla o no

  if existe <> 0 -- Si existe de verdad (si count() no devuelve cero)
    set edad_num = ( select edad from usuario where nombre=username );
  else -- La edad por defecto son 18
    set edad_num = 18;
    insert into usuario(nombre, edad) select username, 18 from usuario;
  end if;
  
  return edad_num;
end |
  #5 (permalink)  
Antiguo 13/09/2012, 08:21
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Usando argumento en función MySQL

Leíste lo que te puse en la liga??? porque en ningún lado veo que lo estés utilizando:

Código:
SELECT count(nombre) INTO existe 
FROM usuario 
WHERE nombre = username;
Mucho ojo kies89, no esperes encontrar una solución solo para copiar y pegar... cuando te pongamos alguna Liga y te pidamos que la veas, HAZLO, pero hazlo a conciencia.

Saludos
Leo.
  #6 (permalink)  
Antiguo 13/09/2012, 08: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: Usando argumento en función MySQL

Código MySQL:
Ver original
  1. DELIMITER$$
  2. CREATE FUNCTION miweb.edad_numero(username VARCHAR(20)) RETURNS tinyint
  3.   DECLARE edad_num tinyint;
  4.   IF (SELECT COUNT(nombre) FROM usuario WHERE nombre=username) > 0  THEN
  5.     SELECT edad INTO edad_num FROM usuario WHERE nombre=username;
  6.   ELSE -- La edad por defecto son 18
  7.     SET edad_num = 18;
  8.     INSERT INTO usuario(nombre, edad) VALUES(username, edad_num);
  9.   END IF;
  10.   RETURN edad_num;
  11. END$$
__________________
¿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 13/09/2012, 08:48
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Usando argumento en función MySQL

Cita:
Iniciado por leonardo_josue Ver Mensaje
Leíste lo que te puse en la liga??? porque en ningún lado veo que lo estés utilizando:

Código:
SELECT count(nombre) INTO existe 
FROM usuario 
WHERE nombre = username;
Mucho ojo kies89, no esperes encontrar una solución solo para copiar y pegar... cuando te pongamos alguna Liga y te pidamos que la veas, HAZLO, pero hazlo a conciencia.

Saludos
Leo.





Perdón, es que no entiendo mucho eso de las ligas... Lo googleé en algunas páginas y me vi el insert y pensaba que en la liga que me pasaste también ponía insert. Perdón.

Aquí el código actual, y debajo el error que me da :(.



Código:
delimiter |
create function miweb.edad_numero(username varchar(20)) returns tinyint
begin
  declare existe tinyint;
  declare edad_num tinyint;

  select count(nombre) into existe from usuario where nombre=username;  -- Si el usuario existe en la tabla o no
  
  if existe <> 0 -- Si existe de verdad (si count() no devuelve cero)
    select edad into edad_num from usuario where nombre=username;
  else
    -- La edad por defecto son 18
    set edad_num = 18;
    insert into usuario(nombre, edad) select username, 18 from usuario;
  end if;
  
  return edad_num;
end |





Error:
ERROR 1064 (42000): 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 'select edad into edad_num from usuario where nombre=username;
else

se' at line 9
  #8 (permalink)  
Antiguo 13/09/2012, 08:53
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: Usando argumento en función MySQL

Prueba lo que te pasé...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 13/09/2012, 09:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Usando argumento en función MySQL

Nuevamente te lo comento... hay que poner un poquito de atención en los errores que te está marcando el Motor: el error no tiene nada que ver con la variable EXISTE ni tampoco con la sentencia SELECT-INTO. El error lo tienes en esta línea:

Código:
 if existe <> 0 -- Si existe de verdad (si count() no devuelve cero)
La sintaxis del IF indica que es necesaria la palabra reservada THEN, la cual NO APARECE EN NINGÚN LUGAR. lo correcto es que pongas esto:

Código:
IF existe <> 0 THEN -- Si existe de verdad (si count() no devuelve cero) 
.........
También la opción de gnzsoloyo debería funcionar.

Saludos
Leo.
  #10 (permalink)  
Antiguo 13/09/2012, 09:32
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Usando argumento en función MySQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Prueba lo que te pasé...
Lo leí tarde...
jejeje ok! muchísimas gracias ^^, el código mejorado y todo :). Muchas a ti y a leonardo_josue :P.

Una pregunta... ¿eso de MODIFIES SQL DATA?

Cita:
Varias características proporcionan información sobre la naturaleza de los datos usados por la rutina. CONTAINS SQL indica que la rutina no contiene comandos que leen o escriben datos. NO SQL indica que la rutina no contiene comandos SQL . READS SQL DATA indica que la rutina contiene comandos que leen datos, pero no comandos que escriben datos. MODIFIES SQL DATA indica que la rutina contiene comandos que pueden escribir datos. CONTAINS SQL es el valor por defecto si no se dan explícitamente ninguna de estas características.

Pero no entiendo muy bien qué cambio provoca sobre la función... ¿me lo podrías explicar de otra forma a la aquí expuesta, por favor?

Y tema cerrado :).
  #11 (permalink)  
Antiguo 13/09/2012, 09:40
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Usando argumento en función MySQL

Hola de Nuevo:

En la función estás realizando un INSERT... es por eso que debes colocar MODIFIES SQL DATA

Cita:
MODIFIES SQL DATA indicates that the routine contains statements that may write data (for example, INSERT or DELETE)
Saludos
Leo.
  #12 (permalink)  
Antiguo 13/09/2012, 09:41
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: Usando argumento en función MySQL

El sentido de esas dos palabras es simple: Una función es un una rutina que devuelve un valor. Como se supone que si es sólo debe tener una salida de datos no se espera que modifique datos. La capacidad de modificar datos es una extensión que se le otorga a las SF, por lo que debe indicarse expresamente lo que hace para que tenga acceso a recursos que una función usualmente no debería tener.
¿se entiende la lógica?
En algunos servidores es posible que puedas cargar la función sin esas cláusula, pero luego en los backups se produciría el error.
Por lo demás, el error más grave es que te habías olvidado del THEN del IF.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 13/09/2012, 09:54
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Usando argumento en función MySQL

Muchísimas gracias.

Una cosa... gnzsoloyo, ¿qué significan las siglas SF?
  #14 (permalink)  
Antiguo 13/09/2012, 09:58
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: Usando argumento en función MySQL

Stored Function

Es un acrónimo usual en el foro para no tener que escribir el término completo, lo mismo que poner SP por stored procedure.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: select, tabla
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 15:40.