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 PostgreSQL Discussion :

Des macros pour lancer des requêtes avec paramètres


Sujet :

Requêtes PostgreSQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut Des macros pour lancer des requêtes avec paramètres
    Salut,

    je voudrais savoir s'il était possible de créer des macros afin de lancer des requêtes paramétrables. Je suis amené à faire régulièrement des sélections qui se ressemblent plus ou moins et j'aimerais gagner du temps.

    Par exemple, pour splitter une table en deux échantillons aléatoires, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create temp table t1 as
    select * from table_totale
    order by random ()
    limit 1248;
    create temp table t2 as
    select * from table_totale
    where idmembre not in (select distinct idmembre from t1);
    j'aimerais donc une macro qui me permettent de lancer une ligne du code avec les paramètres les noms des nouvelles tables, la table à splitter, la taille de la 1ere nouvelle table. Ça pourrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    macro_split (table_totale, t1, t2, 1248, idmembre);
    Merci ;-)

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Oui c'est faisable notamment avec des fonctions en plpgsql.
    Dans les fonctions il faudrait utiliser l'instruction EXECUTE qui permet de faire du SQL dynamique c'est-à-dire des requêtes dont certaines parties du genre nom de table ou nom de colonnes proviennent de variables.

  3. #3
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Oui c'est faisable notamment avec des fonctions en plpgsql.
    Dans les fonctions il faudrait utiliser l'instruction EXECUTE qui permet de faire du SQL dynamique c'est-à-dire des requêtes dont certaines parties du genre nom de table ou nom de colonnes proviennent de variables.
    C'est effectivement très utile, merci! Avec l'instruction PREPARE puis EXECUTE ça marche.

    Seulement on ne peut pas prendre en paramètre des noms de tables.
    Connais-tu une alternative?

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour, enutilisant la fonction quote_ident
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute'....'||quote_ident(v_table)||'...'

  5. #5
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par xavier-Pierre Voir le message
    bonjour, enutilisant la fonction quote_ident
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute'....'||quote_ident(v_table)||'...'
    J'ai essayé mais ca ne marche pas. Pourquoi est-ce que le code suivant ne fonctionne pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PREPARE essai (text) AS
        SELECT * FROM quote_ident($1)
        WHERE email = 'jean-mouloud@barbes.fr';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute essai (client);

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut tout d'abord créer une fonction plpgsql.
    Le EXECUTE en question n'est pas celui du SQL mais celui du plpgsql, et il n'y a pas de PREPARE à faire.

    Il y a un exemple ici sur une demande un peu similaire (ça concernait un nom de schéma au lieu d'un nom de table mais le principe est le même):

  7. #7
    Candidat au Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Il faut tout d'abord créer une fonction plpgsql.
    Le EXECUTE en question n'est pas celui du SQL mais celui du plpgsql, et il n'y a pas de PREPARE à faire.

    Il y a un exemple ici sur une demande un peu similaire (ça concernait un nom de schéma au lieu d'un nom de table mais le principe est le même):
    Je me doute que je vais en fatiguer plus d'un mais je n'arrive pas à faire le programme même le plus simple. J'ai crée cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE FUNCTION sy.essai(nomtable VARCHAR) returns void AS $$
    declare
    	toto VARCHAR;
    begin
    	toto = 'select * from ' || nomtable || ' limit 100;';
     
    EXECUTE toto;
    end ; 
    $$ LANGUAGE plpgsql
    elle se compile bien mais quand j'essaie de la lancer, via la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from sy.essai('profil');
    On me renvoie une cellule vide alors que quand je fais un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from profil limit 100;
    Car marche parfaitement. Bref ou est-ce que je me plante?

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    quote_ident(table)

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    La fonction est déclarée RETURNS void et n'a pas d'instruction RETURN donc il est normal qu'elle ne retourne rien.
    Ce qui n'empêche pas les instructions SQL à l'intérieur de la fonction d'avoir été exécutées.

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/05/2014, 15h19
  2. Réponses: 6
    Dernier message: 24/02/2012, 14h25
  3. Créer des boutons pour lancer des agents
    Par Fabdeuche dans le forum Lotus Notes
    Réponses: 0
    Dernier message: 12/11/2009, 16h14
  4. Acces limite pour lancer des requetes pour certains
    Par Boubas1 dans le forum Sécurité
    Réponses: 2
    Dernier message: 02/05/2007, 14h37
  5. macro pour lancer une requête
    Par Kleer dans le forum VBA Access
    Réponses: 3
    Dernier message: 06/02/2007, 21h16

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