代码之家  ›  专栏  ›  技术社区  ›  Matti Lyra

MySQL查询浏览器过程错误代码-1

  •  2
  • Matti Lyra  · 技术社区  · 14 年前

    我对MySQL有一个相当奇怪的问题。正在尝试创建一个过程来更新数据库中的某些字段(代码如下)。

    当前注释的行有问题。如果在过程mysql query browser中没有执行任何select语句,则返回错误代码“-1,error executing sql query”。

    我在heidisql中尝试了同样的方法,错误是“无法返回结果集”。所以我想问题是,我是否总是要在程序中选择一些东西,或者我是否遗漏了其他一些东西。

    删除注释后,查询工作正常。

    DELIMITER /
    DROP PROCEDURE IF EXISTS updateFavourites /
    CREATE PROCEDURE updateFavourites(quota INT)
    BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE artist_id,releases INT;
    DECLARE c_artist Cursor FOR
        SELECT Artist.id_number,COUNT(Artist.id_number) FROM Artist
        JOIN CD ON CD.is_fronted_by = Artist.id_number
    GROUP BY Artist.id_number;
    
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
        SET done=1;
    
    IF quota > 0 THEN
        OPEN c_artist;
        REPEAT
        FETCH c_artist INTO artist_id,releases;
            IF NOT done THEN
            IF releases >= quota THEN
                UPDATE CD SET CD.rating='favourite' WHERE CD.is_fronted_by = artist_id;
            END IF;
        END IF;
    UNTIL done END REPEAT;
    CLOSE c_artist;
    -- SELECT 'Great success';
    ELSE
        SELECT CONCAT('\'quota\' must be greater than 0.',' Got (',quota,')'); 
    END IF;
    
    END /
    DELIMITER ;
    

    下面是创建表和一些数据的SQL:

    DROP TABLE IF EXISTS CD;
    DROP TABLE IF EXISTS Artist;
    
    CREATE TABLE Artist (
    id_number INT UNSIGNED AUTO_INCREMENT  PRIMARY KEY,
    name VARCHAR(50),
    );
    
    CREATE TABLE CD (
    catalog_no      INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    is_fronted_by       INT UNSIGNED,
    rating          ENUM ('favourite','top draw','good','so-so','poor','rubbish'),
    CONSTRAINT fk_CD_Artist  FOREIGN KEY (is_fronted_by) REFERENCES Artist(id_number) ON UPDATE     CASCADE
    );
    
    INSERT INTO Artist VALUES(11,'Artist 1');
    INSERT INTO Artist VALUES(10,'Artist 2');
    INSERT INTO CD VALUES (7,11, 'top draw');
    INSERT INTO CD VALUES (650,11,'good');
    INSERT INTO CD VALUES (651,11,'good');
    INSERT INTO CD VALUES (11,10,'favourite');
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Community Egal    7 年前

    谷歌搜索,有几个报告同样的错误,但解决问题的信息很少。甚至还有一个 bug 登录mysql.com,但似乎已被放弃而未得到解决。

    还有另一个堆栈溢出 question 同样的错误,但也无法解决。

    这意味着查询中没有结果集。查看源代码时,有时 MYX_SQL_ERROR 当查询没有结果集时设置。也许这不是一个适当的结果?

    我注意到当我使用 mysql 命令行客户机,调用不返回结果集的过程不会产生错误。


    更新: 我试图恢复MySQL的bug报告,并为它们提供一个好的测试用例。他们将错误从“无反馈”更改为“已验证”——因此至少他们承认这是查询浏览器中的错误:

    [12月11日9:18]斯韦塔·斯米尔诺娃

    账单,

    感谢您的反馈。已证实的 如前所述。

    虽然这很可能只是 修复了MySQL查询浏览器 功能是MySQL的一部分 工作台。

    我想解决方法是忽略-1错误,或者在命令行中测试存储过程。 MySQL 客户端,不发生错误。

    该注释假设当查询浏览器功能成为MySQLWorkbench的一部分时,问题将消失。这是 supposed to happen 在里面 MySQL Workbench 5.2 . 我会下载这个测试版并尝试一下。

    MySQLWorkbench 5.2是beta版的,但我认为MySQLEngineering无法预测beta什么时候会成为GA。在标准条件下,这种预测已经足够困难了,但是由于Oracle收购尚未解决,MySQLs的命运还有很多额外的不确定性。


    更新: 好吧,我试过MySQLWorkbench 5.2.10测试版。我执行了这样的存储过程:

    CREATE PROCEDURE FooProc(doquery SMALLINT)
    BEGIN
      IF doquery THEN
        SELECT * FROM Foo;
      END IF;
    END
    

    当我 CALL FooProc(0) 响应没有结果集,状态只是“确定”。

    当我 CALL FooProc(1) 反应是 SELECT * FROM Foo 果不其然。

    但是,还有另一个与调用过程相关的bug。过程可能有多个结果集,因此在执行 CALL 查询。其结果是MySQLWorkbench 5.2 关闭语句,如果尝试执行另一个查询(或者 呼叫 SELECT )它会给你一个错误:

    命令不同步;现在无法运行此命令。

    MySQL不支持多个并发开放查询。所以最后一个必须关闭才能开始新的。但它并没有关闭 呼叫 查询。这个 bug 也记录在mysql站点上。


    有关命令不同步的错误已解决。他们说它是在MySQLWorkbench 5.2.11中修复的。

        2
  •  2
  •   noonex    14 年前

    查询浏览器不用于运行脚本,只用于单个查询。 我尝试将光标移动到每个查询中(分隔符除外),然后按ctrl+enter来尝试代码。 它毫无问题地创建了该存储过程。(只刷新左边的模式)。

    如果要创建过程,请使用菜单“脚本”->“创建存储过程/函数”。

    但最好忘记QueryBrowser,它根本不受支持(实际上也不有用)。 如果你有足够的硬件和资源,尝试一下 Workbench 5.2 否则使用 SQLyog

        3
  •  0
  •   Neal Swearer    14 年前

    尝试在if块中的多个语句周围放置begin和end块,如下所示:

    IF quota > 0 THEN
        BEGIN
            OPEN c_artist;
            REPEAT
            FETCH c_artist INTO artist_id,releases;
            IF NOT done THEN
                IF releases >= quota THEN
                    UPDATE CD SET CD.rating='favourite' WHERE CD.is_fronted_by = artist_id;
                END IF;
            END IF;
            UNTIL done END REPEAT;
            CLOSE c_artist;
        END;
    ELSE
        SELECT CONCAT('\'quota\' must be greater than 0.',' Got (',quota,')'); 
    END IF;