Postgres: tronca se esiste nella funzione psql con parametro


9

Sto cercando di ottenere una funzione psql che troncerebbe un determinato nome di tabella se esiste. Ho provato più funzioni, ma nessuna di queste ha funzionato finora. Ecco il codice:

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

Ora sono in grado di farlo funzionare in una semplice procedura con un nome codificato:

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

Ma non riesco a capire come mescolare entrambe le domande. Cosa sto facendo di sbagliato qui?


Il problema è il TRUNCATE tableName;. Stai cercando di troncare un tavolo chiamato tableName,
ypercubeᵀᴹ

Risposte:


7

Usa la variabile 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 $$;

Nota che ho usato PERFORMinvece di SELECTcome non ho bisogno di un output della query. Voglio sapere se la query restituisce una riga ( FOUND = true) o meno ( FOUND = false).


Grazie per l'aiuto. Il carattere di sottolineatura è una convenzione di Postgres?
Stanislasdrg Ripristina Monica il

1
È possibile utilizzare "camelCaseIdentifiers" ma devono essere racchiusi tra virgolette doppie per essere realmente sensibili al maiuscolo / minuscolo. Quindi identifiers_with_underscores è una convenzione preferita da molti utenti avanzati di Postgres. Leggi gli identificatori nella documentazione.
klin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.