it-swarm.com.de

Postgres: Abschneiden, wenn in der psql-Funktion mit Parameter vorhanden

Ich versuche, eine psql-Funktion zu erhalten, die einen bestimmten Tabellennamen abschneidet, wenn er existiert. Ich habe mehrere Funktionen ausprobiert, aber bisher hat keine davon funktioniert. Hier ist der 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

Jetzt kann ich es in einem einfachen Verfahren mit einem harcodierten Namen zum Laufen bringen:

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

Aber ich kann mir nicht vorstellen, wie man beide Abfragen mischt. Was mache ich hier falsch?

Verwenden Sie die 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 $$;

Beachten Sie, dass ich PERFORM anstelle von SELECT verwendet habe, da ich keine Ausgabe der Abfrage benötige. Ich möchte wissen, ob die Abfrage eine Zeile zurückgibt (FOUND = true) oder nicht (FOUND = false).

7
klin