VARIADIC
などの高度な機能 または、ポリモーフィック入力タイプと動的SQLでさえ非常に強力です。この回答の最後の章では、高度な例を示しています。
- PL / pgSQL関数をリファクタリングして、さまざまなSELECTクエリの出力を返します
ただし、あなたのような単純なケースでは、デフォルト値を使用できます。 関数パラメータ用。それはすべて正確な要件に依存します。
もし 問題の列はすべてNOT NULL
で定義されています 、これはおそらくもっと簡単で速いでしょう:
CREATE OR REPLACE FUNCTION update_site(_name text -- always required
, _city text DEFAULT NULL
, _telephone integer DEFAULT NULL)
RETURNS integer AS
$func$
BEGIN
IF _city IS NULL AND _telephone IS NULL THEN
RAISE WARNING 'At least one value to update required!';
RETURN; -- nothing to update
END IF;
UPDATE "Sites"
SET "City" = COALESCE(_city, "City")
, "Telephone" = COALESCE(_telephone, "Telephone")
WHERE "SiteName" = _name;
END
$func$ LANGUAGE plpgsql;
マニュアルのデフォルト値についてお読みください!
パラメータと列名の間の名前の競合を避けるために、入力パラメータの前に_
を付けることを習慣にしています。 。それは好みとスタイルの問題です。
- 最初のパラメータ
name
常に必要なので、デフォルトはありません。 - 他のパラメータは省略できます。
- 少なくとも1つ、または
WARNING
が必要です が発生し、他に何も起こりません。 -
UPDATE
指定されたパラメータの列のみを変更します。 - Nに簡単に拡張できます パラメータ。
関数呼び出し
Postgres 9.5以降 :
簡単な方法は、位置表記を使用することです。 パラメータ用。これにより、右端のパラメーターのみを省略できます:
SELECT update_site('foo', 'New York'); -- no telephone
名前付き表記 anyを省略できます デフォルト値を持つパラメータ:
SELECT update_site(name => 'foo', _telephone => 123); -- no city
両方を混合表記で組み合わせることができます :
SELECT update_site('foo', _telephone => 123); -- still no city
Postgres 9.4 以上、 :=
通話での割り当てに使用されました:
SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);
下位互換性のためにPostgres12でも引き続き有効ですが、最新の表記法を使用してください。