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 :

[pb requête sql] Requête dynamique


Sujet :

PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut [pb requête sql] Requête dynamique
    supprimé

  2. #2
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    normal, en plpgsql tu ne peux pas retourner directement un result de requete, ca marche en language SQL mais là non, pour cela il faut que tu utilise LOOP
    exemple d'utilisation :
    http://postgresql.developpez.com/faq...kees#appelproc

    en regardant vite fait ton code, tu y gagnerai de la passer en requete dynamique puisque que tu n'as que AND b.inscrit_genre = $1 qui change...
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    supprimé

  4. #4
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Salut,
    alors pour une requete dynamique, il faut utiliser un curseur (il y a peut une meilleure facon)

    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
    29
    30
    CREATE OR REPLACE FUNCTION "public"."fonc_obtenir_profil_region_online_tab_bord" (inscrit_genre_arg integer, inscrit_region_id_arg bigint, inscrit_age_min_arg 
     
    integer, inscrit_age_max_arg integer, inscrit_en_ligne_date_connexion_arg bigint, limit_arg integer, offset_arg integer) RETURNS SETOF 
     
    "public"."type_select_profil_region_online_tab_bord" AS
    $body$
    DECLARE
     curs1 refcursor;
     rec record;
     requete text;
    BEGIN
     requete:='SELECT inscrit_id,inscrit_pseudo,inscrit_age,media_inscrit_url_standard FROM inscrit_en_ligne a,inscrit b,media_inscrit c ';
     requete:=requete||' WHERE b.inscrit_id = a.inscrit_en_ligne_inscrit_id AND b.inscrit_id = c.media_inscrit_inscrit_id';
     IF $1 <>3 THEN
      requete:=requete||' AND b.inscrit_genre = '||$1;
     END IF;
     requete:=requete||' AND b.inscrit_region_id = '||$2||' AND b.inscrit_age BETWEEN '||$3||' AND '||$4||' AND c.media_inscrit_type = ''PHOTO'' ';
     requete:=requete||' AND c.media_inscrit_rang = 1 AND a.inscrit_en_ligne_date_connexion > '||$5||' LIMIT '||$6||' OFFSET '||$7;  
     OPEN curs1 FOR EXECUTE requete;
     LOOP
      FETCH curs1 INTO rec;
      IF NOT FOUND THEN
       EXIT;
      END IF;
      return next rec;
     END LOOP;
     return ;
    END;
    $body$
    LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
    je n'ai pas testé, dis moi si ca marche.

    je me suis mis dans ma todolist pour la faq --> faire un exemple de requete dynamique
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    a priori, il n'est pas nécessaire d'utiliser un curseur pour parcourir une requête dynamique ; un FOR - IN - EXECUTE devrait faire l'affaire.
    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
    CREATE OR REPLACE FUNCTION "public"."fonc_obtenir_profil_region_online_tab_bord" (inscrit_genre_arg integer, inscrit_region_id_arg bigint, inscrit_age_min_arg integer, inscrit_age_max_arg integer, inscrit_en_ligne_date_connexion_arg bigint, limit_arg integer, offset_arg integer) RETURNS SETOF 
     
    "public"."type_select_profil_region_online_tab_bord" AS 
    $body$ 
    DECLARE 
     rec type_select_profil_region_online_tab_bord%rowtype; 
     requete text; 
    BEGIN 
     requete:='SELECT inscrit_id,inscrit_pseudo,inscrit_age,media_inscrit_url_standard FROM inscrit_en_ligne a,inscrit b,media_inscrit c '; 
     requete:=requete||' WHERE b.inscrit_id = a.inscrit_en_ligne_inscrit_id AND b.inscrit_id = c.media_inscrit_inscrit_id'; 
     IF $1 <>3 THEN 
      requete:=requete||' AND b.inscrit_genre = '||$1; 
     END IF; 
     requete:=requete||' AND b.inscrit_region_id = '||$2||' AND b.inscrit_age BETWEEN '||$3||' AND '||$4||' AND c.media_inscrit_type = ''PHOTO'' '; 
     requete:=requete||' AND c.media_inscrit_rang = 1 AND a.inscrit_en_ligne_date_connexion > '||$5||' LIMIT '||$6||' OFFSET '||$7;  
     FOR rec IN EXECUTE requete LOOP
      RETURN NEXT rec;
     END LOOP;
     return ; 
    END; 
    $body$ 
    LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    effectivement ca marche autant pour moi
    il devait y avoir une raison, mais je sais plus laquelle.
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Merci !

Discussions similaires

  1. [SQL] Requête SQL : obtenir un total
    Par Riwalenn dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 26/09/2006, 10h19
  2. [SQL] Requête SQL trop compliquée pour lui.
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 23/05/2006, 22h52
  3. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 16h32
  4. [SQL] Requête SQL
    Par Kit59 dans le forum Oracle
    Réponses: 2
    Dernier message: 29/06/2005, 18h15
  5. Réponses: 2
    Dernier message: 06/06/2005, 15h13

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