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