web-dev-qa-db-fra.com

Postgres: tronquer s'il existe dans la fonction psql avec le paramètre

J'essaye d'obtenir une fonction psql qui tronquerait un nom de table donné s'il existe. J'ai essayé plusieurs fonctions, mais aucune n'a fonctionné jusqu'à présent. Voici le code:

CREATE OR REPLACE FUNCTION truncateIfExists(tableName TEXT)
returns void
as $$
BEGIN
EXECUTE format(
'IF EXISTS (
    SELECT *
    FROM information_schema.tables 
    WHERE table_name =' || tableName || '
    )
THEN
TRUNCATE tableName;
END IF;
');
END;
$$language plpgsql

Maintenant, je peux le faire fonctionner dans une procédure simple avec un nom codé:

do $$
begin
IF EXISTS (SELECT * 
 FROM information_schema.tables 
 WHERE table_name = genre_epf)
 THEN
 TRUNCATE genre_epf;
END IF;
end
$$;

Mais je ne peux pas comprendre comment mélanger les deux requêtes. Qu'est-ce que je fais mal ici?

Utilisez la variable FOUND :

create or replace function truncate_if_exists(tablename text)
returns void language plpgsql as $$
begin
    perform 1
    from information_schema.tables 
    where table_name = tablename;
    if found then
        execute format('truncate %I', tablename);
    end if;
end $$;

Notez que j'ai utilisé PERFORM au lieu de SELECT car je n'ai pas besoin d'une sortie de la requête. Je veux savoir si la requête renvoie une ligne (FOUND = true) ou pas (FOUND = false).

7
klin