PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  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 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Procédure PL/pgSQL et nom de table en paramètre

Technique - Langages Procéduraux (PL) | Procédure PL/pgSQL et nom de table en paramètre

Par yodaz le 20/04/2006 - 16:43

Bonjour,
Est il possible en PL/pgSQL de faire une procédure prenant en paramètre un nom de table,
et qui ensuite exécute des requêtes de la forme SELECT champ1 INTO mavar FROM matable_passe_en_parametre ?

Exemple de ce que je voudrais faire :

CREATE OR REPLACE FUNCTION myFunc(nomTable VARCHAR(255)) RETURNS void AS $$
DECLARE
mavar integer DEFAULT 0;
BEGIN
SELECT INTO mavar count(*) FROM nomTable;
-- suite du code de la procedure
END;
$$ LANGUAGE plpgsql;

J'ai essayé de créer cette procédure, mais elle ne compile pas.
D'ou est ce que pourrais venir le problème ?

Merci d'avance.

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Si tu dois absolument avoir l

sparky/ = 23 Avril, 2006 - 12:14

Si tu dois absolument avoir le nombre de ligne par table, cela ne fonctionnera pas ainsi. Tu dois passer par une table temporaire: test données ne seront visible que pour la session courante et sera droppé quand la fonction finira ;-)

Donc tu aurais

CREATE OR REPLACE FUNCTION my_func("varchar")
RETURNS int4 AS
$BODY$
declare
table_name alias for $1;
m_sql varchar;
nb int;
begin
select count(*) into nb from pg_stat_user_tables where relname='t';
if nb = 0 then
execute 'create temp table t (nb_ligne int8,table_name text) on commit delete rows';
end if;
m_sql:='insert into t select count(*),'''||table_name||''' from '||table_name;
execute m_sql;
select nb_ligne into nb from t where table_name=table_name;
return nb;
end;
$BODY$
LANGUAGE 'plpgsql';


remarque que ce j'ai dit pré

sparky/ = 28 Avril, 2006 - 15:38

remarque que ce j'ai dit précédemment ne fonctionne pas 2 fois d'affilé, la solution est

execute 'select count(*) from '||nom_table into nCount;

donc ton code devient

CREATE OR REPLACE FUNCTION myFunc(nomTable VARCHAR(255)) RETURNS void AS $$
DECLARE
mavar integer DEFAULT 0;
BEGIN
execute 'SELECT count(*) FROM '||nomTable INTO mavar ;
-- suite du code de la procedure
END;
$$ LANGUAGE plpgsql;


Ok, merci :)

yodaz/ = 9 Mai, 2006 - 11:14

Ok, merci :)


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.