Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/10/2011, 12h04   #1
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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 :
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 :
macro_split (table_totale, t1, t2, 1248, idmembre);
Merci ;-)
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 13h03   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 15h08   #3
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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?
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 15h36   #4
Membre confirmé
 
Homme
Inscription : janvier 2006
Messages : 227
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations forums :
Inscription : janvier 2006
Messages : 227
Points : 239
Points : 239
bonjour, enutilisant la fonction quote_ident
Code :
execute'....'||quote_ident(v_table)||'...'
xavier-Pierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 16h13   #5
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
Citation:
Envoyé par xavier-Pierre Voir le message
bonjour, enutilisant la fonction quote_ident
Code :
execute'....'||quote_ident(v_table)||'...'
J'ai essayé mais ca ne marche pas. Pourquoi est-ce que le code suivant ne fonctionne pas?

Code :
1
2
3
PREPARE essai (text) AS
    SELECT * FROM quote_ident($1)
    WHERE email = 'jean-mouloud@barbes.fr';
Code :
execute essai (client);
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 22h33   #6
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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):
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 13h57   #7
Invité de passage
 
Femme
Chargé de référencement
Inscription : 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 : 1
Points : 1
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 :
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 :
SELECT * FROM sy.essai('profil');
On me renvoie une cellule vide alors que quand je fais un simple :

Code :
SELECT * FROM profil LIMIT 100;
Car marche parfaitement. Bref ou est-ce que je me plante?
elsergio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 17h31   #8
Membre confirmé
 
Homme
Inscription : janvier 2006
Messages : 227
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations forums :
Inscription : janvier 2006
Messages : 227
Points : 239
Points : 239
quote_ident(table)
xavier-Pierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 17h46   #9
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h18.


 
 
 
 
Partenaires

Hébergement Web