Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/04/2011, 19h34   #1
Invité régulier
 
Homme
Étudiant
Inscription : mars 2011
Messages : 19
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : Étudiant
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mars 2011
Messages : 19
Points : 5
Points : 5
Par défaut Curseur ne fonctionne pas avec Mysql

Bonjour,
j'essaye d'exécuter cet simple exemple d'une procédure ayant un curseur, le problème est que le résultat me selectionne un seul nom!
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
CREATE PROCEDURE retrouverNom1(IN profession VARCHAR(9), OUT nom VARCHAR(10)) 
BEGIN
DECLARE  emp_name  VARCHAR(30); 
DECLARE curseur CURSOR FOR SELECT ename FROM emp WHERE job = profession; 
OPEN curseur; 
FETCH curseur INTO nom ;
CLOSE curseur;
END$$
DELIMITER ;
CALL retrouverNom1('MANAGER', @nom);
SELECT @nom;
j'exécute ça sur Mysql en utilisant sqlYog quelqu'un vois le problème?
merci
larbiDida est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 16h56   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
La procédure ne te renvoie qu'un nom, et c'est parfaitement normal, puisque tu n'as qu'un paramètre en sortie (OUT).
A priori, c'est même le dernier nom rencontré lors du balayage du curseur...

Il semble que tu souhaites en retour tout un ensemble de données ?

Je ne suis pas certain que l'utilisation d'une procédure soit adaptée

Tu peux peut-être utiliser en retour un paramètre en format TEXT que tu remplis dans le fetch en concaténant les occurrences trouvées; mais sans garantie !
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h51   #3
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
Si... mais un curseur n'est qu'un pointeur de lecture qui bouge d'un cran vers l'avant à chaque fetch faut peut-être envisager de faire UNE BOUCLE DE LECTURE NON?

Tu défini des variables qui te servent à rien (je suppose que ça vient de différents tests) et tu as des longueurs de chaines de caractères très variées (9,10,30)...
De plus, une variable ne peut contenir un set de données mais juste un type scalaire (nombres, booléens ou chaines de caractères)...

En plus, pourquoi, si tu veux juste afficher ton set de résultat tu fais pas un simple select à la place du curseur dans la procédure?

Code :
1
2
3
4
5
6
DELIMITER $$
CREATE PROCEDURE retrouverNom1(IN profession VARCHAR(9)) 
BEGIN
SELECT ename FROM emp WHERE job = profession;
END$$
DELIMITER ;

Si tu dois exploiter tes résultats encore en mysql tu peux les concaténer pendant ta boucle de lecture avec un séparateur dans une variable de type texte

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DELIMITER $$
CREATE PROCEDURE retrouverNom1(IN profession VARCHAR(9), OUT retour text) 
BEGIN
declare done bool DEFAULT false;
DECLARE  emp_name  VARCHAR(30); 
DECLARE curseur CURSOR FOR SELECT ename FROM emp WHERE job = profession;
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 
OPEN curseur; 
repeat
FETCH curseur INTO emp_name;
IF NOT done then
SET retour=concat_ws(";",retour,emp_name);
end IF;
until done end repeat;
CLOSE curseur;
END$$
DELIMITER ;
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h21.


 
 
 
 
Partenaires

Hébergement Web