我在使用 MySQL 时遇到了一个相当奇怪的问题。尝试创建一个过程来更新数据库中的某些字段(代码如下)。
问题出在当前注释的行上。看来,如果在过程中没有执行任何 SELECT 语句,MySQL 查询浏览器将返回错误代码“-1,执行 SQL 查询时出错”。
我在 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');
最佳答案
查询浏览器不适用于运行脚本,仅用于单个查询。 我通过将光标移动到每个查询(DELIMITER 除外)并按 Ctrl+Enter 来尝试您的代码。 它毫无问题地创建了该存储过程。 (只需刷新左侧的架构)。
如果您想创建过程,请使用菜单“脚本”->“创建存储过程/函数”。
但最好忘记 QueryBrowser,它根本不受支持(而且实际上没有用)。 如果您有不错的硬件和充足的资源,请尝试Workbench 5.2否则使用 SQLyog
关于MySQL查询浏览器程序错误代码-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1847656/