Postgres: truncar si existe en la función psql con parámetro


9

Estoy tratando de obtener una función psql que truncaría un nombre de tabla dado si existe. He estado probando múltiples funciones, pero ninguna de ellas funcionó hasta ahora. Aquí está el 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

Ahora, puedo hacer que funcione en un procedimiento simple con un nombre codificado:

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

Pero no puedo entender cómo mezclar ambas consultas. Qué estoy haciendo mal aquí ?


El problema es el TRUNCATE tableName;. Está intentando truncar una tabla llamada tableName,
ypercubeᵀᴹ

Respuestas:


7

Utilice la variable ENCONTRADA :

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 $$;

Tenga en cuenta que he usado en PERFORMlugar de, SELECTya que no necesito una salida de la consulta. Quiero saber si la consulta devuelve alguna fila ( FOUND = true) o no ( FOUND = false).


Gracias por tu ayuda. ¿El guión bajo indica una convención de Postgres?
Stanislasdrg Restablece a Monica el

1
Es posible usar "camelCaseIdentifiers" pero deben estar entre comillas dobles para que realmente distingan entre mayúsculas y minúsculas. Por lo tanto, identificators_with_underscores es una convención preferida por muchos usuarios avanzados de Postgres. Lea sobre los identificadores en la documentación.
klin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.