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?


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).


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.