2016-01-25 1 views
0

Comment créer une fonction dans postgresql avec tablename comme argument et la fonction renvoie l'ensemble de résultats de la table qui est passée en argument pour la requête "select * from TABLE". Ici, le TABLE est l'argument passé à la fonction. Ce que vous voulez est possible mais complètement et complètement inutile.Fonctions avec tablename comme argument dans postgresql

+0

Voir les exemples dans le manuel: http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN –

+0

Pouvez-vous expliquer ce que vous voulez vraiment faire? Une fonction du type que vous décrivez serait inutile et compliquée à utiliser. – Patrick

+0

Fonction @Patrick nommée selectall (nom_table). Et la fonction exécute "select * from nomtable", puis le jeu de résultats est retourné. – mrg

Répondre

3

La fonction que vous demandez est le suivant:

CREATE FUNCTION selectall(tbl name) RETURNS SETOF record AS $$ 
BEGIN 
    RETURN QUERY EXECUTE format('SELECT * FROM %I', tbl); 
END; 
$$ LANGUAGE plpgsql; 

Vous avez besoin d'une fonction de retour ensemble (SRF), car une table peut avoir plusieurs lignes. Il doit renvoyer record car des tables différentes renvoient différents ensembles de colonnes. Vous ne pouvez pas utiliser cette SRF dans une liste de sélection:

test=# SELECT selectall('student'); 
ERROR: set-valued function called in context that cannot accept a set 
CONTEXT: PL/pgSQL function selectall(name) line 3 at RETURN QUERY 

Vous pouvez l'utiliser comme une source de ligne, mais la requête devient plus qu'un SELECT * FROM student simple. Vous ne pouvez pas utiliser comme si:

Vous ne pouvez l'utiliser en spécifiant une définition d'alias et de colonne:

test=# SELECT * FROM selectall('student') AS t(id int, first_name text, col3 boolean, ...); 

Comparons maintenant que, pour:

test=# SELECT * FROM student;