Postgres: Potong jika ada dalam fungsi psql dengan parameter

9

Saya mencoba untuk mendapatkan fungsi psql yang akan memotong nama tabel yang diberikan jika ada. Saya sudah mencoba banyak fungsi, tetapi tidak ada yang bekerja sejauh ini. Ini kodenya:

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

Sekarang, saya bisa membuatnya bekerja dalam prosedur sederhana dengan nama yang harcoded:

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

Tapi saya tidak bisa membungkus kepala saya tentang cara mencampur kedua pertanyaan. Apa yang saya lakukan salah di sini?

Stanislasdrg Reinstate Monica
sumber
Masalahnya adalah TRUNCATE tableName;. Anda mencoba untuk memotong sebuah tabel bernama tableName,
ypercubeᵀᴹ

Jawaban:

7

Gunakan variabel DITEMUKAN :

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

Perhatikan bahwa saya telah menggunakan PERFORMalih-alih SELECTkarena saya tidak memerlukan output dari kueri. Saya ingin tahu apakah kueri mengembalikan baris ( FOUND = true) atau tidak ( FOUND = false).

klin
sumber
Terima kasih untuk bantuannya. Apakah garis bawah menamai konvensi Postgres?
Stanislasdrg Reinstate Monica
1
Dimungkinkan untuk menggunakan "camelCaseIdentifiers" tetapi mereka harus dilampirkan dalam tanda kutip ganda agar benar-benar peka terhadap huruf besar-kecil. Karenanya identifiers_with_underscores adalah konvensi yang disukai oleh banyak pengguna Postgres tingkat lanjut. Baca tentang pengidentifikasi dalam dokumentasi.
klin