【问题标题】:MySql stored procedure through Commands out of sync when using select statement with no resultMySql存储过程通过命令不同步使用select语句时没有结果
【发布时间】:2018-05-12 08:08:42
【问题描述】:

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 语句不返回结果,我为什么会收到这样的错误?

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    我通过如下更新 SELECT 查询设法解决了这个问题:

    SELECT rgt, user_id INTO @r, @u_id FROM filemanager_files WHERE id=mother_id;
    

    我还是不明白为什么要改用@r:=rgt, @u_id:user_id;每当 SELECT 语句没有返回结果时都会遇到错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多