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 23/05/2011, 16h49   #1
Membre régulier
 
Inscription : juin 2007
Messages : 198
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 198
Points : 90
Points : 90
Par défaut Simulation d'une liste/tableau pour itération

Bonjour,

Je voudrais savoir s'il y a un moyen simple de simuler une liste (tableau, array) comme argument d'une fonction ou d'une procédure, dans l'idée de ne faire qu'une seule fonction/procédure pour répondre à mes besoins, et côté serveur SQL pour soulager l'applicatif...

Un petit exemple que je reprends d'un récent sujet que j'ai lançé :
Soient 3 tables :
element_name (id int, name varchar)
single (id int, name varchar)
assemblage (id int, element_name_id int, single_id int) avec element_name_id et single_id des clés étrangères sur les id respectivement des tables element_name et single.

Exemple d'element_name : skateboard, voiture, moto, velo
Exemple de single : guidon, volant, roue, frein, porte

Je vais avoir comme "assemblage"s :
skateboard/roue
velo/roue
velo/frein
velo/guidon
moto/roue
moto/frein
moto/guidon
voiture/roue
voiture/frein
voiture/volant
voiture/porte

Je voudrais ajouter de nouveaux assemblages avec des elements deja existant.
J'aimerais une procedure que j'appelerais de cette manière :

Code :
1
2
call create_assemblage('bus','roue','frein','volant','porte')
call create_assemblage('roller','roue','frein')
le premier argument serait l'element a creer et les autres sont les single à inserer dans assemblage avec ce nouvel element.

Du style :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# inserer le nouvel element
INSERT INTO element_name (name) VALUES ('bus')
# recuperer son id
SELECT id FROM element_name WHERE name='bus'
 
# premier couple de l'assemblage
SELECT id2 FROM single WHERE name='roue' ;
INSERT INTO assemblage (element_name_id, single_id) VALUES (id, id2)
 
# second couple de l'assemblage
SELECT id2 FROM single WHERE name='frein' ;
INSERT INTO assemblage (element_name_id, single_id) VALUES (id, id2)
 
etc...
et ceci dans une boucle pour le faire autant de fois que d'éléments en argument...
ou bien, imaginer de concatener les elements dans le deuxième argument mais il faut trouver un moyen d'itérer sur ces arguments dans la fonction/procedure :

Code :
1
2
call create_assemblage('bus','roue,frein,volant,porte')
call create_assemblage('roller','roue,frein')
Merci pour vos avis !
fabrice91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 09h41   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
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 : 848
Points : 1 325
Points : 1 325
salut,

oui tu concatène tes résultats avec 1 ou plusieurs séparateurs (1 ou plusieurs caractères) en une chaine de caractère ou tu les concatène de manière plus hiérarchique en xml (plutôt pour une utilisation externe à mysql ensuite)
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h23   #3
Membre régulier
 
Inscription : juin 2007
Messages : 198
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 198
Points : 90
Points : 90
Citation:
Envoyé par ericd69 Voir le message
salut,

oui tu concatène tes résultats avec 1 ou plusieurs séparateurs (1 ou plusieurs caractères) en une chaine de caractère ou tu les concatène de manière plus hiérarchique en xml (plutôt pour une utilisation externe à mysql ensuite)
Merci pour ta réponse mais je ne comprends pas tout...
De quels résultats parles-tu ?
Pour l'instant, je n'ai pas de résultats mais juste des arguments à passer.
Je connais la fonction CONCAT par contre je n'ai pas vu de SPLIT...comment découper ensuite la concaténation ?
fabrice91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h34   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
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 : 848
Points : 1 325
Points : 1 325
coté php par exemple
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h39   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
peut etre que ce lien peut vous aider

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h51   #6
Membre régulier
 
Inscription : juin 2007
Messages : 198
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 198
Points : 90
Points : 90
Citation:
Envoyé par ericd69 Voir le message
coté php par exemple
Ah non, je voulais rester uniquement en procédural, sinon en effet je fais tout en Perl et là plus de problème...

Citation:
Envoyé par Yanika_bzh Voir le message
peut etre que ce lien peut vous aider
Merci pour le lien, oui en effet ce serait une solution...
Mais c'est dingue tout de même qu'il y ait des fonctionnalités de ce type, si complexes, alors qu'il n'y a pas un simple "split(str, delim)" sur lequel on pourrait itérer !!!
Par ce que avec cette solution XML, il faudrait que mon appel de procédure soit :
Code :
call create_assemblage('bus','<a>roue</a><a>frein</a><a>volant</a><a>porte</a>')
au lieu d'un simple :
Code :
call create_assemblage('bus','roue|frein|volant|porte')
fabrice91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h07   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
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 : 848
Points : 1 325
Points : 1 325
je pense que ça vient du fait que mysql permet de convertir automatiquement les résultats renvoyés en xml plutôt que normalement...



enfin ça date quand même seulement de la version 5.1.5
ericd69 est dé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 15h15.


 
 
 
 
Partenaires

Hébergement Web