115 votes

Nom de table comme paramètre de fonction PostgreSQL

Je veux passer un nom de table comme paramètre dans une fonction Postgres. J'ai essayé ce code :

CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer 
AS $$
    BEGIN
    IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
     return 1;
    END IF;
    return 0;
    END;
$$ LANGUAGE plpgsql;

select some_f('table_name');

Et j'ai eu ça :

ERROR:  syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
                                                             ^

********** Error **********

ERROR: syntax error at or near "."

Et voici l'erreur que j'ai obtenue lorsque j'ai changé pour ceci select * from quote_ident($1) tab where tab.id=1 :

ERROR:  column tab.id does not exist
LINE 1: ...T EXISTS (select * from quote_ident($1) tab where tab.id...

Probablement, quote_ident($1) fonctionne, car sans le where quote_ident($1).id=1 partie que j'obtiens 1 ce qui signifie que quelque chose est sélectionné. Pourquoi le premier quote_ident($1) travail et le second pas en même temps ? Et comment résoudre ce problème ?

2voto

Julien Feniou Points 179

Si la question était de tester si la table est vide ou non (id=1), voici une version simplifiée de la procédure stockée d'Erwin :

CREATE OR REPLACE FUNCTION isEmpty(tableName text, OUT zeroIfEmpty integer) AS
$func$
BEGIN
EXECUTE format('SELECT COALESCE ((SELECT 1 FROM %s LIMIT 1),0)', tableName)
INTO zeroIfEmpty;
END
$func$ LANGUAGE plpgsql;

2voto

Sandip Debnath Points 555

Si vous souhaitez que le nom de la table, le nom de la colonne et la valeur soient transmis dynamiquement à la fonction en tant que paramètre.

utiliser ce code

create or replace function total_rows(tbl_name text, column_name text, value int)
returns integer as $total$
declare
total integer;
begin
    EXECUTE format('select count(*) from %s WHERE %s = %s', tbl_name, column_name, value) INTO total;
    return total;
end;
$total$ language plpgsql;

postgres=# select total_rows('tbl_name','column_name',2); --2 is the value

-2voto

dm3 Points 1

J'ai la version 9.4 de PostgreSQL et j'utilise toujours ce code :

CREATE FUNCTION add_new_table(text) RETURNS void AS
$BODY$
begin
    execute
        'CREATE TABLE ' || $1 || '(
        item_1      type,
        item_2      type
        )';
end;
$BODY$
LANGUAGE plpgsql

Et puis :

SELECT add_new_table('my_table_name');

Ça marche bien pour moi.

Attention ! L'exemple ci-dessus est l'un de ceux qui montrent "Comment ne pas faire si nous voulons garder la sécurité pendant l'interrogation de la base de données" :P

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X