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


9

存在する場合、指定されたテーブル名を切り捨てる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
$$;

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


問題はTRUNCATE tableName;です。あなたは、という名前のテーブルを切り捨てるしようとしているtableName
ypercubeᵀᴹ

回答:


7

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


ご協力ありがとうございました。アンダースコアはPostgresの命名法ですか?
Stanislasdrg Reinstate Monica

1
「camelCaseIdentifiers」を使用することもできますが、実際に大文字と小文字を区別するには、二重引用符で囲む必要があります。したがって、identifiers_with_underscoresは、多くの上級Postgresユーザーが好む規則です。ドキュメントで
klin 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.