これは仕様によるものです。マニュアルでは、可変置換の章で説明しています。 :
変数の置換は現在、
SELECT
でのみ機能します 、INSERT
、UPDATE
、およびDELETE
これは、メインSQLエンジンがこれらのコマンドでのみクエリパラメータを許可するためです。他のステートメントタイプ(一般にユーティリティステートメントと呼ばれる)で非定数の名前または値を使用するには、ユーティリティステートメントを文字列およびEXECUTE
として作成する必要があります。
できません EXECUTE
を使用して動的ステートメントの値をパラメーター化します 動的コマンドの実行の章を引用しているためです。 :
パラメータシンボルのもう1つの制限は、
SELECT
でのみ機能することです。 、INSERT
、UPDATE
、およびDELETE
コマンド。他のステートメントタイプ(一般にユーティリティステートメントと呼ばれます)では、値が単なるデータ値であっても、テキストで値を挿入する必要があります。
唯一のオプション plpgsql関数では、値をコマンド文字列に連結します。 format()
を使用できます 、ただし、単純な例では、単純な連結は安全で簡単です::
CREATE OR REPLACE FUNCTION pg_temp.setdistinct(_cnt real)
RETURNS void
LANGUAGE plpgsql AS
$$
BEGIN
EXECUTE 'ALTER TABLE _temp ALTER COLUMN id SET (n_distinct=' || _cnt || ')';
END
$$;
スキーマ修飾pg_temp.
質問を反映した(文書化されていない!)「一時的な」機能にします。
n_distinct
に関するマニュアル 。