我在 MySql 中有以下存储过程
CREATE PROCEDURE fileAdd (OUT `file_id` INT UNSIGNED, IN `mother_id` INT UNSIGNED, IN `input_filename` VARCHAR(255), IN `input_dte` INT UNSIGNED, IN `input_user_id` SMALLINT UNSIGNED, IN `input_type` TINYINT(1) UNSIGNED)
BEGIN
SET @r = 1;
SET @u_id = 0;
SELECT @r:=rgt, @u_id:=user_id FROM filemanager_files WHERE id=mother_id;
IF @u_id = 0 THEN
SET @u_id = input_user_id;
END IF;
UPDATE filemanager_files SET lft = lft + 2 WHERE lft >= @r;
UPDATE filemanager_files SET rgt = rgt + 2 WHERE rgt >= @r;
INSERT INTO filemanager_files (rgt, lft, filename, dte_created, dte_updated, user_id, type) VALUES (@r+1, @r, input_filename, input_dte, input_dte, @u_id, input_type);
SET file_id = LAST_INSERT_ID();
END
主要输入变量是 mother_id,这给我带来了问题。 当我使用参数 mother_id=0 调用它时,里面的语句工作正常,并且新行被插入到表中,但出现以下错误:
SQL 查询:SET FOREIGN_KEY_CHECKS = ON;
MySQL 说:#2014 - 命令不同步;您现在无法运行此命令
令人惊讶的是,当我使用参数 mother_id="A_VALID_ROW_ID"调用相同的过程时,一切正常,并且没有收到任何错误。 我从程序中删除了以下语句
SELECT @r:=rgt, @u_id:=user_id FROM filemanager_files WHERE id=mother_id;
我用参数 mother_id = 0 再次测试,这次没有收到错误。
似乎每当 select 语句由于 where 子句而没有返回结果时,我都会收到这样的错误。 我的过程对 @r 和 @u_id 变量有默认值,如果后面的 SELECT 语句不返回结果,那么为什么我会收到这样的错误?
最佳答案
我通过更新 SELECT 查询成功解决了这个问题,如下所示:
SELECT rgt, user_id INTO @r, @u_id FROM filemanager_files WHERE id=mother_id;
我还不明白为什么要使用@r:=rgt, @u_id:user_id 来代替;每当 SELECT 语句没有返回结果时就会遇到错误。
关于MySql 存储过程通过命令在使用 select 语句时不同步而没有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538846/