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

PostgreSQL Discussion :

Fonction avec chaine en arguments pour critère de restriction


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 89
    Points
    89
    Par défaut Fonction avec chaine en arguments pour critère de restriction
    bonjour,
    Plutot que d'écrire un certain nombre de requêtes, j'ai décidé d'utiliser une fonction qui va filtrer une table selon un champ.

    J'ai donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE FUNCTION test(text)
      RETURNS bigint AS
    'select count(*) from productions_a_en_stock where code_prod IN ($1);'
      LANGUAGE 'sql' VOLATILE;
    ALTER FUNCTION test(text) OWNER TO postgres;
    Le problème est que j'aurai souhaité pour certains filtres avoir une liste d'arguments.
    J'ai fait quelques essais en passant un anyarray mais j'avoue que ca commence devenir complexe pour un si petit problème.(En plus de ne pas fonctionner)

    Un problème similaire a été résolu ici
    http://www.developpez.net/forums/sho....php?p=3271036
    Mais je n'ai pas reussi à transposer pour pg.

  2. #2
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    si ton $1 = 45,46,47 pourquoi

    select count(*) from productions_a_en_stock where code_prod IN (45,46,47) ne marcherait pas?

    t'as essayé?

    j'ai peut -etre pas bien pigé la demande
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  3. #3
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 89
    Points
    89
    Par défaut
    En fait code_prod est une chaine de caractères. Peu être que ca fonctionnerai avec des entiers, en revanche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select test('Production LL,Production IP');
    Ne fonctionne pas puisque ca donne


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from productions_a_en_stock where code_prod IN ('Production LL,Production IP')
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from productions_a_en_stock where code_prod IN ('Production LL','Production IP')
    En fait j'ai peu être mal expliqué mais c'est le résultat auquel je voudrais arriver.

  4. #4
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    c'est un peu ce que je craignais
    il faudrait essayer en manipulant la chaine en amont et aval

    passer :
    '\'Production LL\',\'Production IP\''
    et supprimer premier et dernier caractère..
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  5. #5
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 89
    Points
    89
    Par défaut
    Moi aussi c'est ce que je craignais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select test('\'Production LL\',\'Production IP\'');
    Ne fonctionne pas,
    pourtant Production LL seul renvoie 17 et production IP seul renvoie 7. Pourquoi ?

  6. #6
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 89
    Points
    89
    Par défaut
    J'ai crée une petite fonction de derrière les fagots
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE FUNCTION test3(text)
      RETURNS text AS
    $BODY$select '\''||replace($1,',','\',\'')||'\'';$BODY$
      LANGUAGE 'sql' VOLATILE;
    ALTER FUNCTION test3(anyarray) OWNER TO postgres;
    qui permet de bien quoter les chaines de caractères comme je veux.
    entrée :
    un,deux,trois
    sortie:
    'un','deux','trois'

    J'ai des warnings mais ça fonctionne.
    Pourtant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from productions_a_en_stock where code_prod IN (test3('Production IP,Production LL'));
    Ne fonctionne toujours pas. Y a t'il un moyen de savoir quelle ordre sql est exécuté?

  7. #7
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 89
    Points
    89
    Par défaut
    On pourrait aussi faire une liste de WHERE OR.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE FUNCTION test4(text)
      RETURNS text AS
    $BODY$select ''''||replace($1,',',''' or code_prod = ''')||'''';$BODY$
      LANGUAGE 'sql' VOLATILE;
    ALTER FUNCTION test3(text) OWNER TO postgres;
    Mais ca ne fonctionne encore pas !!!

    Bon, ce ne serait pas par hasard parce que l'ordre sql est compilé à l'avance ? J'ai lu ca sur un autre forum mais c'etait un autre sgbd . C'est quoi la solution ? Du sql dynamique ?

Discussions similaires

  1. fonction avec nb d'argument variable
    Par firstnewgaia dans le forum Débuter
    Réponses: 2
    Dernier message: 06/05/2011, 12h30
  2. Fonction avec et sans arguments
    Par moussecp dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/04/2010, 22h28
  3. Assigner une fonction avec passage d'arguments
    Par r0seBa dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/03/2010, 10h54
  4. appel d'une fonction avec pointeur comme argument
    Par airness86180 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 13h34
  5. histoire de fonction avec problème sur arguments
    Par bébé dans le forum Langage
    Réponses: 5
    Dernier message: 07/01/2006, 11h29

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