MySQL - Ayuda con error 1064.

   
Vista:

Ayuda con error 1064.

Publicado por hadrien (24 intervenciones) el 14/04/2008 21:13:12
Hola,

estoy trabajando con MySQL 5.0. Tengo la tabla FILE con diferentes particiones FILE_PK (con k desde 0 hasta N ) y un procedimiento almacenado que inserta filas de valors en la partición correcta:

CREATE PROCEDURE insert_file (
IN idfile BIGINT UNSIGNED,
IN id2 VARCHAR(32),
IN name VARCHAR(128),
IN size BIGINT UNSIGNED,
IN checksum VARCHAR(32),
IN user SMALLINT UNSIGNED,
IN `group` TINYINT UNSIGNED,
IN permits TINYINT UNSIGNED,
IN dir BIGINT UNSIGNED
)
BEGIN
DECLARE n BIGINT DEFAULT 0;
IF idfile < 10000000 THEN
SET n = ( idfile DIV 5000 );
ELSE
SET n = 2000;
END IF;
SET @stmt = CONCAT('INSERT INTO file_p',n,
' VALUES(',idfile,',',id2,',',name,',',
size,',',checksum,',',user,',',`group`,',',permits,',',dir,')');
PREPARE stmt FROM @stmt;
EXECUTE stmt;
END;

Pero cuando llamo al procedimiento para insertar valores:

CALL insert_file(1,'123','/docs.txt',45,'gfretgfe',2,3,1,1);

Obtengo el siguiente error:

ERROR 1064 (42000) at line 24: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
near '/docs.txt,45,gfretgfe45,2,3,1,1)' at line 1.

Sin embargo, no sé ver dónde está el problema realmente... ¿Alguien puede echarme una mano, por favor?

¡Gracias!
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

RE:Ayuda con error 1064.

Publicado por Gonzalo GC (339 intervenciones) el 14/04/2008 23:23:17
La cosa tiene varios detalles:
1. Las sentencias preparadas no pueden funcionar dentro de un Store Procedure en MySQL, al menos hasta la versión 5.1. Cualquier duda, mirar al final de la página del manual de referencia: http://dev.mysql.com/doc/refman/5.0/es/sqlps.html
2. Aunque pudieran prepararse y ejecutarse, tienes que lograr que los strings, en este caso el nombre del archivo y el checksum, queden encerrados entre apóstrofes, o de lo contrario no los interpretará como strings.
En tu caso la sentencia queda, dentro de la variable, armada así:
'INSERT INTO file_p11 VALUES(1,123,/docs.txt,45,gfretgfe,1,3,1,1)'
con lo que docs.txt se interpreta como nombre de un campo de una tabla llamada "docs", y el checksum es una variable de nombre "gfretgfe", pero no es un string.
3. Nunca tienes que usar nombres de palabras reservadas como nombres de variables. En este caso "user" y "checksum" son palabras reservadas (una es una clausula y el otro es una función). Sólo Dios sabe qué está tratando de hacer MySQL cuando las quiere interpretar.
4. Finalmente, ¿para qué estás intentando hacer una sentencia preparada dentro de un store procedure, si lo que quieres lograr se obtiene con un INSERT casi directo:

CREATE PROCEDURE insert_file (
IN idfile BIGINT UNSIGNED,
IN id2 VARCHAR(32),
IN name VARCHAR(128),
IN size BIGINT UNSIGNED,
IN checksumX VARCHAR(32),
IN userX SMALLINT UNSIGNED,
IN `group` TINYINT UNSIGNED,
IN permits TINYINT UNSIGNED,
IN dir BIGINT UNSIGNED
)
BEGIN
DECLARE @n VARCHAR(45)
IF idfile < 10000000 THEN
SET @n = CONCAT(file_p,( idfile DIV 5000 ));
ELSE
SET @n = CONCATfile_p,2000);
END IF;

INSERT INTO @n
VALUES(idfile, id2, name, size, checksumX, userX, `group`, permits, dir);

END;
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

RE:Ayuda con error 1064.

Publicado por hadrien (24 intervenciones) el 14/04/2008 23:31:48
Hola,

muchas gracias por tu ayuda y tus consejos. Lo de las palabras reservadas sólo lo he tenido en cuenta para group y lo he pasado por alto en user y checksum, gracias por el toque.
Es cierto que al final todo se queda en un simple insert, sólo que es MySQL, en el procedimiento almacenado, quine determina en qué partición le toca insertar. De todas maneras, de momento sólo estoy haciendo pruebas y quizá este trabajo lo dejo para la aplicación.

De nuevo, gracias por tu respuesta.

Saludos.
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

RE:Ayuda con error 1064.

Publicado por Gonzalo GC (339 intervenciones) el 15/04/2008 13:05:27
En realidad es mejor edjarle ciertas cosas a la aplicación, ya que no nos debemos olvidar que el SQL es en definitiva un lenguaje de consultas, y no de programación fina.
Con esto quiero decir que es mejor darle a MySQl ciertas cosas terminadas. Te evita perder tiempo después en las etapas de optimizació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

RE:Ayuda con error 1064.

Publicado por elbita (1 intervención) el 02/08/2012 15:40:58
hola estoy realizando una base de datos llamada inventario, las dos primeras tablas trabajan bien, perlo luego voy a relacionar la tabla equipos con la tabla departamento y me sale un error:
use inventario;

CREATE TABLE usuarios
(usuario varchar(20) NOT NULL,
clave varchar(20) NOT NULL,
PRIMARY KEY (usuario)) ENGINE=InnoDB;

CREATE table departamento
(id_departamento integer(4) NOT NULL auto_increment,
nombre_departamento varchar(15) NOT NULL,
PRIMARY KEY (id_departamento)) ENGINE=InnoDB;

CREATE table equipos
(id_equipo integer(5) NOT NULL auto_increment,
id_departamento integer(4) NOT NULL,
monitor varchar(20) NOT NULL,
cpu varchar(20) NOT NULL,
teclado varchar(20) NOT NULL,
mouse varchar(20) NOT NULL,
regulador varchar(20) NOT NULL,
corneta varchar(20) NOT NULL,
impresora varchar(20) NOT NULL,
operador varchar(15) NOT NULL,
clave varchar(10) NOT NULL,
observacion varchar(30) NOT NULL,
PRIMARY KEY (id_equipo),
KEY id_departamento (id_departamento),
FOREING KEY (id_departamento) REFERENCES departamento (id_departamento) ON UPDATE CASCADE) ENGINE=InnoDB;

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 'KEY (id_departamento) REFERENCES departamento (id_departamento) ON UPDATE CASCAD' at line 16

por favor si alguien me puede ayudar se lo agradezco mucho. porque soy muy novata en BD y no se donde esta el error.
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
Imágen de perfil de xve

RE:Ayuda con error 1064.

Publicado por xve (899 intervenciones) el 02/08/2012 17:28:32
Hola, se escribe FOREIGN en vez de FOREING...
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

RE:Ayuda con error 1064.

Publicado por angel mikilopolo_13-25@hotmail.com (1 intervención) el 27/05/2013 00:02:50
TENGO UN PROBLEMA CON UN SERVIDOR DE JUEGOS SE LLAMA GUNBOUND YA ME PASE MAS DE 3 DIAS INTENTANDO Q FUNCIONE BIEN Y ME SALE EL ERROR EN EL SQL Y NO SE Q ASER POR FAVOR ALGUIEN Q ME ENSEÑE O Q ME DIGA COMO ASER UN SERVER DE GUNBOUN O Q ME AYUDE ASER PARA SAVER COMO ASER PORFAVOR MI CORREO ES : mikilopolo_13-25@hotmail.com. grasias atentamente angel





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 '.
Memoria de servidor máxima es 2147483647 MB or' at line 1
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