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

Requêtes MySQL Discussion :

Sql dynamique dans les fonctions


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 78
    Par défaut Sql dynamique dans les fonctions
    Bonjour,

    Je travaille actuellement sur une version 5 de mysql et j'ai vu qu'il n'est pas possible de créer des fonctions stockées dynamiques.

    J'ai besoin de créer une fonction dans laquelle je passe en paramètre le nom d'une table pour l'utiliser dans une requête (SELECT). Cela n'est pas possible en mysql 5

    J'aimerais savoir si cela devient possible dans une version plus récente de mysql (même une version payante).
    Quelqu'un peut-il me renseigner ?

  2. #2
    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
    salut,

    en fait c'est possible en utilisant une requête préparée dans ta procédure ou fonction stockée
    tu stockes la concaténation de la chaine correspondant à ta requête et du nom de la table dans une variable globale et tu exécutes ça, par exemple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set @truc=concat('select * from ',nom,' where id=1');
    prepare exe from @truc;
    execute exe;
    deallocate prepare exe;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 78
    Par défaut
    salut et merci pour ta réponse.

    Le problème est bien là : avec ma version 5 de mysql, le code que tu m'a donné fonctionne bien pour les procédures mais pas pour les fonctions !

    j'ai ce message d'erreur :

    Dynamic SQL is not allowed in stored function or trigger

  4. #4
    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
    je crois pas qu'il y ait une version de mysql qui le fasse dans les fonctions...

    fait une procédure stockée si tu peux... vu ce que tu lui demandes de faire c'est ce que tu dois faire de toute façon

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 78
    Par défaut
    Merci pour ta réponse.

    En fait je t'explique un peu plus mon problème :
    Dans l'application sur laquelle je travaille, on a une table assez grosse qui fait près de 3 millions d'enregistrements. Et chaque ligne contient une quarantaine champs de tout type.

    Cette table étant au cœur de notre application, nous avons décidé de la scinder en plusieurs tables (une par compte) afin d'optimiser les performances des recherches.

    On a donc toujours la table globale qui contient tous les enregistrements. Les insert et update sont faits sur cette table globale.
    On a mis un trigger sur cette table afin que les modifications soient automatiquement répercutées sur la table du compte concerné.

    Cela nous a permis de beaucoup gagner en performances lors des requêtes select. Le problème, c'est que les fonctions que nous utilisons pour certaines recherches continuent à aller taper dans la table globale.
    C'est pour cela que je cherche à savoir si une version de mysql permet de faire des fonctions dynamiques.

    Je ne perdspas espoir qu'un jour mysql puisse gérer ça ^^

  6. #6
    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
    Les triggers sont plus limités que les procédures stockées.

    Moi, je te conseille de faire une API de procédures stockées une fois pour toute...

    Comme ça, côté application, une fois que l'adaptation est faite, elle n'a plus du tout à être refaite et tu as dé-corrélé les changements entre l'application et la bd.

    En plus, tu te facilites la maintenance ensuite.

    Il faut toujours scinder les grosses bd... même un gros sgbdr comme oracle n'est pas si performant avec 3 millions de tuples... mysql est plutôt pensé pour 50000 à 200000 tuples selon les traitements (pour rester dans des temps de traitements supportables de quelques secondes).

  7. #7
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Citation Envoyé par mello Voir le message
    Merci pour ta réponse.

    En fait je t'explique un peu plus mon problème :
    Dans l'application sur laquelle je travaille, on a une table assez grosse qui fait près de 3 millions d'enregistrements. Et chaque ligne contient une quarantaine champs de tout type.

    Cette table étant au cœur de notre application, nous avons décidé de la scinder en plusieurs tables (une par compte) afin d'optimiser les performances des recherches.

    On a donc toujours la table globale qui contient tous les enregistrements. Les insert et update sont faits sur cette table globale.
    On a mis un trigger sur cette table afin que les modifications soient automatiquement répercutées sur la table du compte concerné.

    Cela nous a permis de beaucoup gagner en performances lors des requêtes select. Le problème, c'est que les fonctions que nous utilisons pour certaines recherches continuent à aller taper dans la table globale.
    C'est pour cela que je cherche à savoir si une version de mysql permet de faire des fonctions dynamiques.

    Je ne perdspas espoir qu'un jour mysql puisse gérer ça ^^
    Je ne suis pas persuadé que votre solution soit la bonne...
    Vous scindez une table contenant plusieurs comptes en plusieurs tables contenant un compte, c'est ca ?
    Et cela dans un but d’améliorer les performances de recherche ?
    Si c’était pour réorganiser votre modèle de données, je ne dis pas, mais pour un problème de performances, je ne crois pas.
    En effet, cela consiste à reculer la prochaine échéance de dégradation de vos performances, car lorsqu'une table aura elle aussi atteint les 3 millions de lignes, vous en serez au même point.
    Cela implique aussi une modification de l'architecture de votre base à chaque ajout de compte (dépendance architecture et fonctionnelle !!)

    Si vos perfs sont mauvaises, peut-être est-ce dû à une mauvaise gestion des indexes, des requêtes peu optimisées qui font des full scan sur votre table (elles feront aussi des full scan sur vos nouvelles tables et vous le ressentirez quand votre volumétrie grandira)...
    Vous allez donc vous trainer un double fonctionnement, du provisoire qui, comme l'on voit souvent, risque de durer sans pour autant résoudre le fond de votre problème.

    Je vous conseillerais (mais cela n'engage que moi) de vérifier votre modèle de données, vérifier les contraintes relationnelles posées, les indexes déclarés, les requêtes peu performantes par des plans d’exécution, avant de vous lancer dans votre belle aventure

    Bon Courage

Discussions similaires

  1. SQL dynamique dans une fonction définie par l'utilisateur
    Par messalux dans le forum Développement
    Réponses: 7
    Dernier message: 11/11/2010, 09h25
  2. SQL dynamique dans une procédure stockée
    Par Amnesiak dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/07/2005, 15h17
  3. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/04/2005, 15h58
  4. Réponses: 2
    Dernier message: 07/10/2004, 17h00
  5. [plpgsql] transaction dans les fonctions ?
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 16h56

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