J'ai un problème assez étrange avec MySQL. Essayer de créer une procédure pour mettre à jour certains champs dans la base de données (le code est ci-dessous).MySQL query browser procedure error code 0
Le problème est avec la ligne actuellement commentée. Il semble que si aucune instruction SELECT n'est exécutée pendant la procédure, le navigateur de requête MySQL retournera un code d'erreur "-1, erreur exécutant une requête SQL".
J'ai essayé la même chose dans HeidiSQL et l'erreur était "impossible de retourner le jeu de résultats". Donc, je suppose que la question est de savoir si je dois toujours sélectionner quelque chose dans la procédure, ou y a-t-il autre chose que j'ai manqué?
La requête fonctionne correctement lorsque le commentaire est supprimé.
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 ;
Voici le SQL pour créer les tables et certaines données:
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');
Je regarde le code dans le bloc IF et je vois plusieurs instructions. Puisqu'il existe plusieurs instructions, celles-ci ne devraient-elles pas être enveloppées dans un bloc BEGIN/END? –
Pour autant que je sache non, mais je suis plutôt nouveau pour les procédures. Comment feriez-vous exactement cela? BEGIN OPEN c_artist; ... END ELSE donne une erreur de syntaxe. Envelopper le bloc IF entier aussi bien. –
Quelle version de MySQL utilisez-vous et pouvez-vous ajouter vos définitions de schéma et éventuellement échantillonner des données? – r00fus