web-dev-qa-db-ja.com

Postgres:パラメータ付きのpsql関数に存在する場合は切り捨て

存在する場合、指定されたテーブル名を切り捨てるpsql関数を取得しようとしています。私は複数の機能を試してきましたが、どれも今のところ機能していません。ここにコードがあります:

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

今、私はそれをハーコードされた名前の簡単な手順で動作させることができます:

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

しかし、両方のクエリをどのように混合するかについて頭を抱えることはできません。ここで何が悪いのですか?

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

クエリの出力は必要ないため、PERFORMではなくSELECTを使用していることに注意してください。クエリが行を返すかどうかを知りたい(FOUND = true) か否か (FOUND = false)。

7
klin