MySql Curseur - Création d'une procédure
je suis en train de créer un curseur pour la première fois. J'ai regardé la documentation, je comprends le concept, mais je n'arrive pas à l'obtenir même être déclaré...
Je suis en utilisant:
- MySql 5.1.41
- Contrairement à d'autres comme un gestionnaire de
- (s'exécutant localement sur un xampp instalation)
Même lorsque le copier-coller l'exemple de l' http://dev.mysql.com/doc/refman/5.1/en/cursors.html
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
OPEN cur2;
read_loop: LOOP
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF done THEN
LEAVE read_loop;
END IF;
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END LOOP;
CLOSE cur1;
CLOSE cur2;
END;
J'ai des erreurs:
Code D'Erreur : 1064
Vous avez une erreur dans votre syntaxe SQL;
consultez le manuel qui correspond à
votre serveur MySQL version pour le
droit de la syntaxe à utiliser près de " à la ligne 3
et un tas d'autres à la suite,
cela ne fait aucun sens pour moi, peut-toute âme charitable de m'aider s'il vous plaît?
Merci
J'ai donc eu l'exemple de la requête au travail (grâce à ajreal), la réinitialisation de la DÉLIMITEUR. Mais quand j'exécute ma requête:
DELIMITER##
CREATE PROCEDURE RetiraPoints()
BEGIN
DECLARE userid BIGINT;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR SELECT uid FROM viewpoints;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
read_loop: LOOP
FETCH cur INTO userid;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO points (iduser, points, pointcat) VALUES (uid, -1, 1), (userid, -1, 2), (userid, -1, 3), (userid, -1, 4), (userid, -1, 5), (userid, -1, 6);
END LOOP;
CLOSE cur;
END;##
j'obtiens:
Code D'Erreur : 1064
Vous avez une erreur dans votre syntaxe SQL;
consultez le manuel qui correspond à
votre serveur MySQL version pour le
droit de la syntaxe à utiliser près de " DÉCLARER fait
INT par DÉFAUT 0; DÉCLARER cur CURSEUR POUR
SÉLECTIONNEZ le liquide provenant DE points de vue; ' à la ligne
1
mon dieu, que c'est dur...
oui, mais je suis connecté en tant que root, c'est mon instalation
besoin de mettre un espace après le délimiteur, Et à la fin
END
ne nécessite pas de ;
mec votre le meilleur, merci merci merci
OriginalL'auteur André Alçada Padez | 2011-01-06
Vous devez vous connecter pour publier un commentaire.
Vous oubliez pas de réinitialiser le délimiteur à
NOT ;
besoin de mettre un espace après le délimiteur
Et la fin
END
ne nécessite pas de;
OriginalL'auteur ajreal
J'avais besoin de faire la même chose, donc j'ai fini par écrire une procédure stockée pour faire le travail. Je l'ai inclus ici et il fonctionne bien sur MySQL Workbench. Fait intéressant, il va pas fonctionner correctement sur Navicat que l'original de l'instruction select ne pas omettre les valeurs NULL et serait, par conséquent, de supprimer l'ensemble de vos index.
Je vous recommande de lire le code et de casser un peu les choses et de les exécuter séparément, de sorte que vous êtes sûr qu'il va faire ce que vous voulez.
La manière dont c'est écrit, il devrait supprimer toutes les clés étrangères dans l'ensemble de vos bases de données dans une connexion donnée. Ne pas exécuter de la manière qu'il est moins c'est ce que vous voulez faire.
Utiliser à vos propres risques.
OriginalL'auteur Gary