IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Syntaxe de définition d'une fonction


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Par défaut Syntaxe de définition d'une fonction
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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,

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Par défaut
    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 !

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Par défaut
    Ok, je vais trouver un autre moyen.

    Merci encore pour ces réponses.

  6. #6
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    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...

  8. #8
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Billets dans le blog
    1
    Par défaut
    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

  9. #9
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    @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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Définition d'une fonction en Prolog
    Par abssef dans le forum Prolog
    Réponses: 6
    Dernier message: 17/06/2008, 20h51
  2. [Débutant] Définition d'une fonction
    Par louftansa dans le forum MATLAB
    Réponses: 8
    Dernier message: 16/04/2008, 11h30
  3. Réponses: 2
    Dernier message: 03/05/2007, 17h17
  4. Définition d'une fonction static ?
    Par tintin72 dans le forum C++
    Réponses: 9
    Dernier message: 22/12/2005, 11h50
  5. afficher la définition d'une fonction stockée
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/09/2004, 13h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo