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?


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).


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.