sql >> データベース >  >> RDS >> PostgreSQL

可変数の入力パラメーターを持つ関数

    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でも引き続き有効ですが、最新の表記法を使用してください。



    1. XML PATH('')の場合:特殊文字のエスケープ

    2. Windows10に移行するときに「システムリソース超過」を修正する方法

    3. XML_LOAD()を使用してXMLファイルをMySQLデータベーステーブルにインポートする方法。働き

    4. SQLiteAssetHelperでバージョン番号に+を使用しないようにする方法