我對MySQL有一個相當奇怪的問題。試圖創建一個過程來更新數據庫中的一些字段(代碼如下)。MySQL查詢瀏覽器程序錯誤代碼-1
問題在於當前評論的行。看起來,如果在過程中沒有執行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');
我正在查看IF塊中的代碼,並且看到多條語句。由於有多個語句,不應將它們包裝在BEGIN/END塊中嗎? – 2009-12-04 15:34:21
據我所知不,但我比較新的程序。你究竟如何做到這一點? BEGIN OPEN c_artist; ... END ELSE 給出了一個語法錯誤。包裹整個IF塊。 – 2009-12-04 15:46:28
您運行的是哪個版本的MySQL,並且可以添加模式定義和可能的樣本數據? – r00fus 2009-12-08 20:30:56