我得到了一个可以在一台机器上工作并且无法在另一台计算机上工作的mysql过程,都安装了mysql 5.7,并且一直在阅读,但我仍未弄清楚,抛出语法错误
错误1064(42000):您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以在'INT)附近使用正确的语法)然后 SET p_mensaje = CONCAT(p_mensaje,“ El producto”,@argTemp,“ no se encu'在第56行
因此,我们将不胜感激,这是代码...
DROP PROCEDURE IF EXISTS sp_registrar_prestamo;
CREATE PROCEDURE sistema_llaves.sp_registrar_prestamo(
in p_id_prestamo INT,
in p_id_objeto_arg VARCHAR(1000)
)
BEGIN
DECLARE p_id_control INT(11) DEFAULT 1;
DECLARE p_mensaje VARCHAR(500) DEFAULT '';
DECLARE p_arreglo VARCHAR(500);
SET p_arreglo = p_id_objeto_arg;
SET @num = LENGTH(p_arreglo);
IF (@num = 0) THEN
SIGNAL SQLSTATE '46003'
SET MESSAGE_TEXT='No se ingreso ningun objeto.';
END IF;
IF p_id_prestamo=0 THEN
IF NOT EXISTS (SELECT id FROM sistema_llaves.tprestamos) THEN
SET @id_prest = 1;
ELSE
SELECT @id_prest:= max(id) FROM sistema_llaves.tprestamos;
SET @id_prest= @id_prest + 1;
END IF;
ELSE
SELECT @id_prest := MAX(id_control) FROM sistema_llaves.tprestamos WHERE id=p_id_prestamo;
SET p_id_control = @id_prest + 1;
SET @id_prest = p_id_prestamo;
END IF;
SET @num =(LENGTH(p_arreglo) - LENGTH(REPLACE(p_arreglo, ',', '')))+1;
IF @num = 1 THEN
IF NOT EXISTS (SELECT id FROM sistema_llaves.tobjetos WHERE id=p_arreglo) THEN
SET p_mensaje = CONCAT("El objeto con id ",p_arreglo, " no se encuentra en la base de datos.");
SIGNAL SQLSTATE '46004'
SET MESSAGE_TEXT= p_mensaje;
ELSE
INSERT INTO sistema_llaves.tprestamos(id,id_control,id_objeto,estado) VALUES (@id_prest,p_id_control,p_arreglo,DEFAULT);
END IF;
ELSEIF @num > 1 THEN
SET p_arreglo= CONCAT(p_arreglo,",");
WHILE @num > 0 DO
SET @argTemp=SUBSTRING(p_arreglo,1,LOCATE(",",p_arreglo)-1);
IF NOT EXISTS(SELECT id FROM sistema_llaves.tobjetos WHERE id=CAST(@argTemp AS INT)) THEN
SET p_mensaje= CONCAT(p_mensaje,"El producto ", @argTemp," no se encuentra en la base de datos. ");
ELSE
INSERT INTO sistema_llaves.tprestamos(id,id_control,id_objeto,estado) VALUES (@id_prest,p_id_control,CAST(@argTemp AS INT),DEFAULT);
SET p_id_control= p_id_control + 1;
END IF;
SET @num = @num - 1;
IF (@num >0) THEN
SET p_arreglo := SUBSTRING(p_arreglo,LOCATE(",",p_arreglo)+1,LENGTH(p_arreglo));
END IF;
END WHILE;
ELSE
SIGNAL SQLSTATE '46005'
SET MESSAGE_TEXT='Error: Hay un problema en la cadena introducida.';
END IF;
SET @num = LENGTH(p_mensaje);
IF (@num>0) THEN
SIGNAL SQLSTATE '46006'`enter code here`
SET MESSAGE_TEXT= p_mensaje;
END IF;`enter code here`
END;
答案 0 :(得分:1)
INT
不是可以与CAST()
一起使用的有效类型。要强制转换为整数,请使用SIGNED
或UNSIGNED
,后面加上可选的INTEGER
(而不是INT
)。
因此将该行更改为:
IF NOT EXISTS(SELECT id FROM sistema_llaves.tobjetos WHERE id=CAST(@argTemp AS SIGNED INTEGER)) THEN
有关所有有效的转换类型,请参见CONVERT()
的说明。