MySql 存储过程通过命令在使用 select 语句时不同步而没有结果

标签 mysql stored-procedures

我在 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/

相关文章:

mysql - 即使端口设置不正确,Django 也会连接到 mysql

php - 同步数据库 sqlite 与 mysql

java - 在 Oracle 中调试存储过程

c# - 来自 c# WinApp 的 Mysql 数据库的存储过程

mysql - 存储过程语法错误

php添加值并打印

php - 在 PHP 中将 MySQL 数据导出到 CSV 时自动前进到下一行?

mysql - View 和零参数过程有什么区别?

java - 通过 JDBC 将可变长度的外键列表作为参数传递给存储过程,然后使用这些列表将行插入表中

MYSQL用户定义变量问题