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


9

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?


Das Problem ist das TRUNCATE tableName;. Sie versuchen , eine Tabelle mit dem Namen trunkieren tableName,
ypercubeᵀᴹ

Antworten:


7

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 PERFORManstelle von verwendet habe, SELECTda ich keine Ausgabe der Abfrage benötige. Ich möchte wissen, ob die Abfrage eine Zeile ( FOUND = true) zurückgibt oder nicht ( FOUND = false).


Danke für deine Hilfe. Benennt der Unterstrich eine Postgres-Konvention?
Stanislasdrg stellt Monica

1
Es ist möglich, "camelCaseIdentifiers" zu verwenden, diese müssen jedoch in doppelte Anführungszeichen gesetzt werden, um wirklich zwischen Groß- und Kleinschreibung unterscheiden zu können. Daher ist identifiers_with_underscores eine Konvention, die von vielen fortgeschrittenen Postgres-Benutzern bevorzugt wird. Informationen zu Kennungen finden Sie in der Dokumentation.
Klin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.