Postgres: Cắt bớt nếu tồn tại trong hàm psql với tham số


9

Tôi đang cố gắng để có được một hàm psql sẽ cắt bớt một tên bảng đã cho nếu nó tồn tại. Tôi đã thử nhiều chức năng, nhưng không ai trong số họ làm việc cho đến nay. Đây là mã:

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

Bây giờ, tôi có thể làm cho nó hoạt động trong một thủ tục đơn giản với tên bị mã hóa:

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

Nhưng tôi không thể quấn đầu về cách trộn cả hai truy vấn. Tôi làm gì sai ở đây ?


Vấn đề là TRUNCATE tableName;. Bạn đang cố gắng cắt bớt một bảng có tên tableName,
ypercubeᵀᴹ

Câu trả lời:


7

Sử dụng biến 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 $$;

Lưu ý rằng tôi đã sử dụng PERFORMthay vì SELECTtôi không cần một đầu ra của truy vấn. Tôi muốn biết liệu truy vấn có trả về bất kỳ hàng nào ( FOUND = true) hay không ( FOUND = false).


Cảm ơn sự giúp đỡ của bạn. Là gạch dưới đặt tên một quy ước Postgres?
Stanislasdrg Tái lập Monica

1
Có thể sử dụng "camelCaseIdentifier" nhưng chúng phải được đặt trong dấu ngoặc kép để thực sự phân biệt chữ hoa chữ thường. Do đó, định danh_with_underscores là một quy ước được nhiều người dùng Postgres ưa thích. Đọc về định danh trong tài liệu.
klin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.