Postgres: Truncar se existir na função psql com o parâmetro


9

Estou tentando obter uma função psql que truncaria um determinado nome de tabela, se existir. Eu tenho tentado várias funções, mas nenhuma delas funcionou até agora. Aqui está o código:

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

Agora, eu posso fazê-lo funcionar em um procedimento simples com um nome codificado:

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

Mas não consigo entender como misturar as duas consultas. O que eu estou fazendo errado aqui ?


O problema é o TRUNCATE tableName;. Você está tentando truncar uma tabela chamada tableName,
ypercubeᵀᴹ

Respostas:


7

Use a variável 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 $$;

Observe que eu usei em PERFORMvez de SELECTnão precisar de uma saída da consulta. Eu quero saber se a consulta retorna qualquer linha ( FOUND = true) ou não ( FOUND = false).


Obrigado pela ajuda. O sublinhado está nomeando uma convenção do Postgres?
Stanislasdrg Restabelece Monica

11
É possível usar "camelCaseIdentifiers", mas eles devem ser colocados entre aspas duplas para fazer distinção entre maiúsculas e minúsculas. Portanto, identifiers_with_underscores é uma convenção preferida por muitos usuários avançados do Postgres. Leia sobre identificadores na documentação.
Klin #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.