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

PL/pgSQL関数のオプションの引数

    PostgreSQL 8.4(実行しているようです)以降、関数パラメーターのデフォルト値があります 。パラメータを最後に配置してデフォルトを指定すると、呼び出しからパラメータを省略できます:

    CREATE OR REPLACE FUNCTION foofunc(_param1 integer
                                     , _param2 date
                                     , _ids    int[] DEFAULT '{}')
      RETURNS SETOF foobar         -- declare return type!
      LANGUAGE plpgsql AS
    $func$
    BEGIN  -- required for plpgsql
       IF _ids <> '{}'::int[] THEN  -- exclude empty array and NULL
          RETURN QUERY
          SELECT *
          FROM   foobar
          WHERE  f1 = _param1
          AND    f2 = _param2
          AND    id = ANY(_ids);    -- "IN" is not proper syntax for arrays
       ELSE
          RETURN QUERY
          SELECT *
          FROM   foobar
          WHERE  f1 = _param1
          AND    f2 = _param2;
       END IF;
    END  -- required for plpgsql
    $func$;
    

    主なポイント:

    • キーワードDEFAULT パラメータのデフォルトを宣言するために使用されます。短い代替案: =

    • 冗長なparam1を削除しました 厄介な例から。

    • SELECT * FROM foobarを返すので 、リターンタイプをRETURNS SETOF foobarとして宣言します RETURNS SETOF recordの代わりに 。匿名レコードを使用する後者の形式は非常に扱いにくいため、呼び出しごとに列定義リストを提供する必要があります。

    • 整数の配列(int[]を使用します )関数パラメータとして。 IFを適応 式とWHERE それに応じて条項。

    • IF ステートメントはプレーンSQLでは使用できません。 LANGUAGE plpgsqlである必要があります そのために。

    _idsの有無にかかわらず電話をかける :

    SELECT * FROM foofunc(1, '2012-1-1'::date);
    

    事実上同じ:

    SELECT * FROM foofunc(1, '2012-1-1'::date, '{}'::int[]);
    

    呼び出しが明確であることを確認する必要があります。同じ名前の別の関数と2つのパラメーターがある場合、Postgresはどちらを選択するかわからない可能性があります。明示的なキャスト(私が示すように)はそれを絞り込みます。それ以外の場合は、型指定されていない文字列リテラルも機能しますが、明示的であることは決して害にはなりません。

    別の関数内から呼び出す:

    CREATE FUNCTION foofuncwrapper(_param1 integer, _param2 date)
      RETURNS SETOF foobar
      LANGUAGE plgpsql AS
    $func$
    DECLARE
       _ids int[] := '{1,2,3}';
    BEGIN
       -- whatever
    
       RETURN QUERY
       SELECT * FROM foofunc(_param1, _param2, _ids);
    END
    $func$;
    


    1. ユーザーアカウントの管理、役割、権限、認証PHPおよびMySQL-パート5

    2. sp_describe_first_result_setがSQLServerでどのように機能するか

    3. SQL Server 2008ManagementStudioがクエリの構文をチェックしていません

    4. MySQLユーザーDBにパスワード列がありません-OSXへのMySQLのインストール