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

9

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?

Stanislasdrg réintègre Monica
la source
Le problème est le TRUNCATE tableName;. Vous essayez de tronquer une table nommée tableName,
ypercubeᵀᴹ

Réponses:

7

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é PERFORMau lieu de SELECTcar 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 non ( FOUND = false).

klin
la source
Merci de votre aide. Le trait de soulignement désigne-t-il une convention Postgres?
Stanislasdrg réintègre Monica
1
Il est possible d'utiliser "camelCaseIdentifiers" mais ils doivent être placés entre guillemets pour être vraiment sensibles à la casse. Par conséquent, identifiers_with_underscores est une convention préférée par de nombreux utilisateurs avancés de Postgres. Lisez à propos des identifiants dans la documentation.
klin