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 22/03/2011, 09h55   #1
Membre habitué
 
Inscription : février 2008
Messages : 141
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 141
Points : 116
Points : 116
Par défaut Syntaxe de définition d'une fonction

Bonjour,

J'essaye de définir la fonction suivante en MySQL 5.5 :

Code :
1
2
3
4
5
6
7
8
9
10
CREATE FUNCTION GroupesLies( @IDgroupe INT )
  RETURNS TABLE
AS
  RETURN
    (SELECT DISTINCT tb2.IDgroupe
     FROM         tb_usr_groupe tb1
       INNER JOIN tb_usr_groupe tb2
         ON   tb1.IDgroupe = @IDgroupe
          AND tb1.IDusr = tb2.IDusr
     ORDER BY tb2.IDgroupe)
Explication : la table "tb_usr_groupe" stocke des liens entre utilisateurs et groupes. Un utilisateur peut faire partie de plusieurs groupes.
Cette fonction prend en argument un groupe, parcourt la liste des utlisateurs de ce groupe, et renvoie la lise de tous les groupes auxquels ces utilisateurs appartiennent.

J'ai tapé la requête "SELECT DISTINCT ... ORDER BY tb2.IDgroupe" toute seule (en remplaçant "@IDgroupe" par une valeur fixe), elle fonctionne, et me renvoie le résultat attendu.

Mon problème : j'essaye de faire manger la définition de la fonction ci-dessus à mon phpmyadmin, il me dit qu'il y a une erreur de syntaxe "près de @IDgroupe INT ) ....". Je n'arrive pas à comprendre laquelle.

Merci d'avance pour votre aide,
__________________
*LeGEC*
LeGEC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 18h59   #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
Inspire toi de la syntaxe : http://dev.mysql.com/doc/refman/5.0/...procedure.html
__________________
"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 22/03/2011, 19h19   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
A priori les fonctions table ne sont pas supportés par MySQL. Cela fait partie des nombreuses fonctionnalités manquantes !

A lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 17h38   #4
Membre habitué
 
Inscription : février 2008
Messages : 141
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 141
Points : 116
Points : 116
Merci pour vos réponses.

Citation:
Envoyé par SQLpro Voir le message
A priori les fonctions table ne sont pas supportés par MySQL.
Arf ! Ca limite sérieusement les possibilités...
Est-ce qu'il y a des moyens de contourner cette limitation !
__________________
*LeGEC*
LeGEC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 14h14   #5
Membre habitué
 
Inscription : février 2008
Messages : 141
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 141
Points : 116
Points : 116
Ok, je vais trouver un autre moyen.

Merci encore pour ces réponses.
__________________
*LeGEC*
LeGEC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 19h50   #6
Invité régulier
 
Inscription : juillet 2009
Messages : 8
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : juillet 2009
Messages : 8
Points : 5
Points : 5
Bonjour à tous,

Une question vient : j'étais justement entrain de m'essayer à l'écriture d'une fonction pour la génération d'une arborescence de manière plus propre (pour l'instant, c'est un mauvais brouillon de croisement de tableaux PHP).

Novice pour les fonctions, j'essayais de comprendre,à partir de la doc', si il était possible de faire le travail sous MySQL. Pour apprendre, j'avais abouti à quelque chose comme (totalement dérisoire, mais pour débuter la recherche) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DELIMITER $$ 
CREATE FUNCTION Coucou ()
	RETURNS @resultats TABLE ( 
		"id" int NOT NULL, 
		"id_parent" int NOT NULL 
	)
	AS BEGIN 
	(
		SELECT 
			a, b
		FROM 
			test 
		WHERE 
			b=' ... id_secteur à 0... '; 
		OR 
			a IN ( 
				SELECT 
					b 
				FROM 
					test 
				WHERE 
					b=' ... id_secteur à 0... '; 
			) 
 
	) 
	DETERMINISTIC
	END $$
DELIMITER ;
Plusieurs questions se posent à moi :
Q1 : si le type "table" n'est pas supporté, peut-on trouver quand même une solution ?
Q2 : si Q1 n'aboutit pas, est-ce raisonnable de passer par une requête MySQL pour ce genre d'opération ? (désolé pour l'accent circonflexe, j'suis sous un ubuntu live mal configuré)
Q3 : qu'est ce qui remplace le mieux la fonction dans une mysql pour ce type de génération (type boucle) ?

Merci beaucoup d'avance
Nothus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 19h55   #7
Invité régulier
 
Inscription : juillet 2009
Messages : 8
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : juillet 2009
Messages : 8
Points : 5
Points : 5
Et parce qu'un malheur n'arrive jamais seul : oui, j'ai lu la ressource fournie, mais il n'est pas possible (hébergement contraint) de faire autrement que du MySQL !

Pour l'instant...
Nothus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h09   #8
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 840
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 : 840
Points : 1 313
Points : 1 313
oui les fonctions stockées sont limitées aux types scalaires (chaines de caractère, booléens ou nombres), en fait ce que peuvent manipuler les variable locales ou globales. Un set de données brut ne peut donc être renvoyé.

à noter que selon la version de mysql que tu utilise, tu devras parfois mettre l'option DETERMINISTIC pour que mysql veuille de ta fonction.

Par contre, tu peux créer un curseur et concaténer tes résultats en utilisant un séparateur quelconque ou les transformer en xml (pour un traitement extérieur à mysql)en retournant du coup un variable de type text.

mysql te permet ensuite de rescinder ta chaine ailleurs dans une procédure ou une autre fonction stockée en cherchant le séparateur choisi... c'est plus lourd mais tu peux quand même t'en sortir
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h42   #9
Invité régulier
 
Inscription : juillet 2009
Messages : 8
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : juillet 2009
Messages : 8
Points : 5
Points : 5
@ericd69 : merci ! J'essayerai ce soir.

Pour l'instant, je me suis débrouillé à partir de mes tableaux :
  • un premier passage pour les ordonner par id parent, où chaque niveau 1 de mon tableau, qui a de 0 à n enfants,
  • un second passage pour ordonner les parents entre eux,
  • et lorsque je souhaite afficher, il me suffit de partir d'un point et de vérifier l'existence de la clé dans mon tableau, pour connaître à la fois si la branche et le nombre de d'enfant du niveau juste en dessous.
Nothus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h19.


 
 
 
 
Partenaires

Hébergement Web