简体   繁体   English

mysql存储过程中的sql语法错误

[英]sql syntax error in mysql stored procedure

i got this mysql procedure that has work with one machine and fails with other computer, both have mysql 5.7 and have been reading and i haven't figured out,throws a syntax error 我有一个可以在一台机器上工作并且无法在另一台计算机上工作的mysql过程,都具有mysql 5.7并且一直在读取,但我还没有弄清楚,抛出语法错误

ERROR 1064 (42000): You have an error in your SQL syntax; 错误1064(42000):您的SQL语法有错误; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT)) THEN SET p_mensaje= CONCAT(p_mensaje,"El producto ", @argTemp," no se encu' at line 56 检查与您的MySQL服务器版本相对应的手册,以在'INT'附近使用正确的语法))然后在第56行设置p_mensaje = CONCAT(p_mensaje,“ El producto”,@argTemp,“ no se encu”

so any help will be apreciated, here is the code... 因此,任何帮助都将不胜感激,这是代码...

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;

INT is not a valid type that you can use with CAST() . INT不是可与CAST()一起使用的有效类型。 To cast to an integer, use either SIGNED or UNSIGNED , with optional INTEGER (not INT ) after it. 要强制转换为整数,请使用SIGNEDUNSIGNED ,其后是可选的INTEGER (不是INT )。

So change that line to: 因此,将该行更改为:

IF NOT EXISTS(SELECT id FROM sistema_llaves.tobjetos WHERE id=CAST(@argTemp AS SIGNED INTEGER)) THEN

See the description of CONVERT() for all the valid conversion types. 有关所有有效的转换类型,请参见CONVERT()的描述。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM