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

[SOLUCIONADO] Error en función

Estas en el tema de Error en función en el foro de Mysql en Foros del Web. Holaa :). Me ha surgido un problema a la hora de programar una función. El problema creo que se debe a incluir un IF dentro ...
  #1 (permalink)  
Antiguo 21/12/2012, 07:06
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Busqueda Error en función

Holaa :).

Me ha surgido un problema a la hora de programar una función. El problema creo que se debe a incluir un IF dentro de otro IF, pero no sé cómo se arregla, y puesto que no he encontrado ninguna solución después de googlearlo, lo pongo aquí:

function.sql
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE FUNCTION animales(animal VARCHAR(15))
  3.   IF (SELECT COUNT(nombre) FROM animales WHERE nombre=animal) > 0  THEN -- Si el animal ya existe en la tabla,
  4.     IF (SELECT sexo FROM animales WHERE nombre=animal) = "macho" THEN -- Comprobar si es macho o hembra
  5.       RETURN 1; -- Si es macho, devolver 1
  6.     ELSE
  7.       RETURN 0; -- Si es hembra, devolver 0
  8.     END IF;
  9.   ELSE -- Si el animal no existe en la tabla,
  10.     INSERT INTO animales(nombre, sexo) VALUES(animal, "macho"); -- Por defecto será siempre macho
  11.     RETURN animal; -- Devolvemos el nombre del animal registrado
  12.   END IF;
  13. END $$
table.sql
Código MySQL:
Ver original
  1. CREATE TABLE animales
  2. (
  3.   nombre varchar(15),
  4.   sexo varchar(6)
  5. );
error_producido.txt
Cita:
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 'MODIFIES SQL DATA
BEGIN
IF (SELECT COUNT(nombre) FROM animales WHERE nombre=an' at line 2
Gracias de antemano.

Última edición por gnzsoloyo; 21/12/2012 a las 11:12 Razón: Mal etiquetado
  #2 (permalink)  
Antiguo 21/12/2012, 07:19
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 en función

No le estas poniendo en el header que valor devuelve ka funcion
Código MySQL:
Ver original 
Vuelve a leer el manual.
__________________
¿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 21/12/2012, 08:49
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Busqueda Respuesta: Error en función

Perdón xD, se me olvidó esa parte en esta función.

Este es el nuevo código de la función:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE FUNCTION web.animales(animal VARCHAR(15) RETURNS TINYINT(1))
  3.   IF (SELECT COUNT(nombre) FROM animales WHERE nombre=animal) > 0  THEN -- Si el animal ya existe en la tabla,
  4.     IF (SELECT sexo FROM animales WHERE nombre=animal) = "macho" THEN -- Comprobar si es macho o hembra
  5.       RETURN 1; -- Si es macho, devolver 1
  6.     ELSE
  7.       RETURN 0; -- Si es hembra, devolver 0
  8.     END IF;
  9.   ELSE -- Si el animal no existe en la tabla,
  10.     INSERT INTO animales(nombre, sexo) VALUES(animal, "macho"); -- Por defecto será siempre macho
  11.     RETURN 2; -- Devolvemos 2
  12.   END IF;
  13. END $$
Y este es el error que sigue dando:
Cita:
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 'RETURNS TINYINT(1))
MODIFIES SQL DATA
BEGIN
IF (SELECT COUNT(nombre) FROM anim' at line 1

Última edición por gnzsoloyo; 21/12/2012 a las 11:13 Razón: Mal etiquetado
  #4 (permalink)  
Antiguo 21/12/2012, 08:59
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 en función

El header sigue mal escrito... LEE EL MANUAL DE REFERENCIA. Estas en la web.
__________________
¿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 21/12/2012, 09:11
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Busqueda Respuesta: Error en función

Listo, este es el código:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE FUNCTION web.animales(animal VARCHAR(15)) RETURNS TINYINT(1)
  3.   IF (SELECT COUNT(nombre) FROM animales WHERE nombre=animal) > 0  THEN -- Si el animal ya existe en la tabla,
  4.     IF (SELECT sexo FROM animales WHERE nombre=animal) = "macho" THEN -- Comprobar si es macho o hembra
  5.       RETURN 1; -- Si es macho, devolver 1
  6.     ELSE
  7.       RETURN 0; -- Si es hembra, devolver 0
  8.     END IF;
  9.   ELSE -- Si el animal no existe en la tabla,
  10.     INSERT INTO animales(nombre, sexo) VALUES(animal, "macho"); -- Por defecto será siempre macho
  11.     RETURN 2; -- Devolvemos 2
  12.   END IF;
  13. END $$
Mensaje de error:
Cita:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
Google:
Debes especificar qué hará la función, si DETERMINISTIC, si va a modificar datos de tablas...
También me dice: ejecuta SET GLOBAL log_bin_trust_function_creators = 1;

Entonces, si en la función pueden haber distintos casos (como ocurre en esta función), que o hacemos SELECT o hacemos un INSERT, y no sabemos previamente si modificaremos o solamente haremos SELECT, ¿qué hago?

Última edición por gnzsoloyo; 21/12/2012 a las 11:14 Razón: Mal etiquetado...
  #6 (permalink)  
Antiguo 21/12/2012, 09:15
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 en función

Código MySQL:
Ver original
  1. create function nombre() returns tipo
__________________
¿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 21/12/2012, 09:16
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Exclamación Respuesta: Error en función

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código MySQL:
Ver original
  1. create function nombre() returns tipo
¿? Eso es lo que tengo puesto.
Pero me da otro error que no tiene nada que ver. Lo acabo de poner.

Saludos.
  #8 (permalink)  
Antiguo 21/12/2012, 11: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, 4 meses
Puntos: 2658
Respuesta: Error en función

Estaba posteando desde el movil, por eso se colgó un poco y no refresca rápido.
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE FUNCTION web.animales(animal VARCHAR(15)) RETURNS TINYINT(1)
  3.     IF (SELECT COUNT(nombre) FROM animales WHERE nombre=animal) > 0  THEN -- Si el animal ya existe en la tabla,
  4.        IF (SELECT sexo FROM animales WHERE nombre=animal) = "macho" THEN -- Comprobar si es macho o hembra
  5.          RETURN 1; -- Si es macho, devolver 1
  6.        ELSE
  7.          RETURN 0; -- Si es hembra, devolver 0
  8.        END IF;
  9.     ELSE -- Si el animal no existe en la tabla,
  10.         INSERT INTO animales(nombre, sexo) VALUES(animal, "macho"); -- Por defecto será siempre macho
  11.         RETURN 2; -- Devolvemos 2
  12.     END IF;
  13. 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)
  #9 (permalink)  
Antiguo 21/12/2012, 11:36
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Busqueda Respuesta: Error en función

Ok, muchísimas gracias, ya funciona :).

Una última cosa,
Cita:
DETERMINISTIC y NOT DETERMINISTIC indican si una rutina siempre produce el mismo resultado para entradas dadas. Por defecto es NOT DETERMINISTIC si no se da ninguna característica, así que debe especificar DETERMINISTIC explícitamente para declarar que la rutina es determinista.
¿Entonces si no sé qué va a pasar pongo DETERMINISTIC y si siempre va a pasar lo mismo pongo NOT DETERMINISTIC? :S.

Saludos.
  #10 (permalink)  
Antiguo 21/12/2012, 11:43
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 en función

Lee este detalle del manual:
Cita:
Un procedimiento o función se considera “determinista” si siempre produce el mismo resultado para los mismos parámetros de entrada, y “no determinista” en cualquier otro caso. Si no se da ni DETERMINISTIC ni NOT DETERMINISTIC por defecto es NOT DETERMINISTIC.
En tu caso, estás metiendo siempre un mismo tipo de parámetro, y siempre devuelve un entero, dentro de un mismo rango dado.
¿Se entiende ahora?
De todos modos, deberías haber usado un SP y no una SF.
Te hubieses ahorrado dolores de cabeza.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 21/12/2012, 14:28
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Sonrisa Respuesta: Error en función

Ok, muchas gracias :D.

De todas formas, las SP las veo igual que las SF, aunque por ahí dicen que las SP son más rápidas...
  #12 (permalink)  
Antiguo 21/12/2012, 16: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, 4 meses
Puntos: 2658
Respuesta: Error en función

No es el tema de rapidez, sino de uso.
El sentido de una SF es obtener un dato, un valor único.
Un SP es para realizar tareas complejas, que impliquen uno o muchos impactos sobre una o muchas tablas, y/u obtener datos de retorno por parámetro o resultados en tabla.
No se trata de las mismas cosas.
__________________
¿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 28/01/2013, 17:56
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Exclamación Respuesta: Error en función

Hola de nuevo! Ya tengo creada la SP, pero lo veo un tanto peligroso, con miles de clientes haciendo consultas simultaneamente y guardado el valor de la consulta en una variable global...

Código MySQL:
Ver original
  1. CALL animales('caballo', @number);
  2. SELECT @number; -- esto lo veo peligroso, puesto que podría cambiar y darle otro valor a otro cliente.

¿Qué opinas?

Última edición por kies89; 28/01/2013 a las 18:03
  #14 (permalink)  
Antiguo 28/01/2013, 18:11
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 en función

Las variables no son globales en el sentido que aplican los lenguajes de programación.
Las variables globales de MySQL lo son únicamente para cada sesión de conexión, pero no son compartidas entre sesiones distintas ni aunque uses el mismo usuario de MySQL.

Lo que yo no encuentro sentido siquiera es que para obtener un único dato uses un stored procedure. Deberías usar una stored function.

Usando una stored function ni siquiera necesitas la variable, en tanto no la precises para otra tarea adicional, dentro de la misma sesión y sólo a nivel de SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 29/01/2013, 06:13
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
Exclamación Respuesta: Error en función

¿Stored Function? Es que googleé y encontré: CREATE FUNCTION y CREATE PROCEDURE, no encuentro lo de las stored functions. Las Stored Functions me salen como "CREATE FUNCTION"... Bueno, hice lo que me dijiste en diciembre, y por eso la creé...
  #16 (permalink)  
Antiguo 29/01/2013, 06:29
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 en función

Precisamente eso son las stored function. En el argot de informática uno habitualmente usa determinados términos técnicos en inglés, que debes aprender a reconocer y dominar. Es parte del lenguaje técnico.
Una stored function o SF, es una "función almacenada", y que para ser creada se usa habitualmente en todos los DBMS la sentencia de clase DDL que se invoca como "CREATE FUNCTION"...
De igual forma, un stored procedure o "SP" es un "procedimiento almacenado", que se crea con la sentencia DDL "CREATE PROCEDURE".
En cuanto a lo que yo te sugerí no era usar un SP, sino una SF.
Prueba de ello es que el codigo que te postee es este:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE FUNCTION web.animales(animal VARCHAR(15)) RETURNS TINYINT(1)
  3.     IF (SELECT COUNT(nombre) FROM animales WHERE nombre=animal) > 0  THEN -- Si el animal ya existe en la tabla,
  4.        IF (SELECT sexo FROM animales WHERE nombre=animal) = "macho" THEN -- Comprobar si es macho o hembra
  5.          RETURN 1; -- Si es macho, devolver 1
  6.        ELSE
  7.          RETURN 0; -- Si es hembra, devolver 0
  8.        END IF;
  9.     ELSE -- Si el animal no existe en la tabla,
  10.         INSERT INTO animales(nombre, sexo) VALUES(animal, "macho"); -- Por defecto será siempre macho
  11.         RETURN 2; -- Devolvemos 2
  12.     END IF;
  13. END $$
Usando eso, tu llamada sería simplemente:
Código MySQL:
Ver original
  1. SELECT animales('caballo') animal_id;
Siendo "animal_id" el alias de salida de la consulta.

¿Está más claro así?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 29/01/2013, 09:18
 
Fecha de Ingreso: septiembre-2012
Ubicación: Madrid
Mensajes: 89
Antigüedad: 11 años, 7 meses
Puntos: 1
De acuerdo Respuesta: Error en función

Ok, muchísimas gracias por todo :).

Tema solucionado.

Etiquetas: select, sql, 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 14:51.